1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#!/usr/bin/perl use warnings; use strict; use Schedule::Cron; my @cronjobs; push(@cronjobs, { timespec => "* 8 * * Mon-Fri 0-40/10", name => "job1", subroutine => \&go_job1 } ); #push(@cronjobs, { timespec => "* 7 * * Mon-Fri 0-40/10", name => "job2", subroutine => \&go_job2 } ); #push(@cronjobs, { timespec => "35 7 * * Mon-Fri", name => "job3", subroutine => \&go_job3 } ); # jede Minute wird die die aktuelle zeit in last_online.txt geschrieben my $cron = new Schedule::Cron(\&last_on); $cron->add_entry("* * * * *"); foreach(@cronjobs){ #$cron->add_entry( $_->{timespec}, \&go_job3 ); $cron->add_entry( $_->{timespec}, \&{$_->{subroutine}}($_->{name}) ); } $cron->run(nofork => 0); sub go_job1{ print shift."\n"; system("notepad.exe"); last_on(); } sub go_job2{ print shift."\n"; system("calc.exe"); last_on(); } sub go_job3{ print shift."\n"; system("calc.exe"); last_on(); } sub get_time_now{ my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(); if($Stunden < 10){ $Stunden = "0".$Stunden; } if($Minuten < 10){ $Minuten = "0".$Minuten; } if($Sekunden < 10){ $Sekunden = "0".$Sekunden; } $Jahr += 1900; if($Monat == 12){ $Monat = 1; } else{ $Monat++; } if($Monatstag < 10){ $Monatstag = "0".$Monatstag; } if($Monat < 10){ $Monat = "0".$Monat; } return $Monatstag.".".$Monat.".".$Jahr." ".$Stunden.":".$Minuten.":".$Sekunden; } sub last_on{ open FH, ">C:\\perl_schedule\\last_online.txt" or die ("Fehler beim schreiben $!"); print FH get_time_now(); close FH; }
1 2 3
my $sub = $_->{subroutine}; my $name = $_->{name}; $cron->add_entry( $_->{timespec}, sub { $sub->($name) } );
2012-11-23T07:53:12 GustlIch möchte ein skript erstellen, welches Cronjobs verwaltet.
Das Skript wird per wperl im Autostart aufgerufen. Beim Herunterfahren soll die Abmeldezeit in einer Datei geschrieben werden, damit ich dann beim nächsten starten des Skripts überprüfen kann ob jobs ausstehen und wenn ja, diese dann starten kann.
2012-11-23T13:02:26 GustlMhh, das wäre ein Möglichkeit, aber da es ja sein kann, das des Skript ja auch aus irgendeinen Grund beendet werden kann, ist mir diese Methode doch lieber.
$cron->get_next_execution_time($cron_entry,[$ref_time])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
#!/usr/bin/perl #Skriptname: scheduler.pl #Funktion: Cronjobs werden aus der scheduler.ini geladen und abgearbeitet #Autor: Jörg Häfner #Datum: 18.12.2012 #Argumente: #use warnings; use strict; use Config::IniFiles; use Schedule::Cron; use Win32::Process; use Win32; my $main_path = "D:/Scheduler/"; my @cronjobs; # Jobs aus der ini laden und in array cronjobs pushen my $config = Config::IniFiles->new( -file => $main_path.'scheduler.ini' ); foreach(1..10){ #Jobs maximal 10 my $job = "job".$_; if ($config->SectionExists( $job )){ push(@cronjobs, { timespec => $config->val( $job, 'timespec' ), name => $config->val( $job, 'name' ), system_str => $config->val( $job, 'system_str' ), parameter => $config->val( $job, 'parameter' ) } ); } } start_schedule(); sub start_schedule{ # jede Minute wird die die aktuelle zeit in last_online.txt geschrieben my $cron = new Schedule::Cron(\&last_on); $cron->add_entry("* * * * *"); my $reftime = get_time_last_job(); foreach(@cronjobs){ if($reftime && $cron->get_next_execution_time($_->{timespec}, $reftime ) < time()){ print "- - - - - - - - - - - - CRONJOB wird nachgeholt - - - - - - - - - - - -\n"; go_job($_->{name}, $_->{system_str}, $_->{parameter}); print "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n"; } } foreach(@cronjobs){ my $sub = $_->{subroutine}; my $name = $_->{name}; my $system_str = $_->{system_str}; my $parameter = $_->{parameter}; $cron->add_entry( $_->{timespec}, sub { go_job->($name, $system_str, $parameter) } ); } $cron->run(nofork => 0); } # Aufruf Cronjobs sub go_job{ my $name = shift; my $system_str = shift; my $parameter = shift; print "Cronjob: ".$name."\n"; if($parameter ne ""){ my $process; Win32::Process::Create($process, $system_str, " ".$parameter, 1, NORMAL_PRIORITY_CLASS, ".") or die Win32::FormatMessage( Win32::GetLastError() ); $process->Suspend(); $process->Resume(); $process->Wait(INFINITE); }else{ system($system_str); } last_on(); } sub last_on{ open FH, ">".$main_path."last_online.txt" or die ("Fehler beim schreiben $!"); print FH time()."\n".get_time_now(); close FH; } sub get_time_last_job(){ my $filename = $main_path."last_online.txt"; if (-e $filename) { open FHR, $filename or die ("Fehler beim öffnen $!"); my $timestring; while(<FHR>){ $timestring = $_; last; } close FHR; if($timestring) { return $timestring; } else { return 0; } } else { return 0; } } sub get_time_now{ my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(); if($Stunden < 10){ $Stunden = "0".$Stunden; } if($Minuten < 10){ $Minuten = "0".$Minuten; } if($Sekunden < 10){ $Sekunden = "0".$Sekunden; } $Jahr += 1900; if($Monat == 12){ $Monat = 1; } else{ $Monat++; } if($Monatstag < 10){ $Monatstag = "0".$Monatstag; } if($Monat < 10){ $Monat = "0".$Monat; } return $Monatstag.".".$Monat.".".$Jahr." ".$Stunden.":".$Minuten.":".$Sekunden; } sub get_time_string{ my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(shift); if($Stunden < 10){ $Stunden = "0".$Stunden; } if($Minuten < 10){ $Minuten = "0".$Minuten; } if($Sekunden < 10){ $Sekunden = "0".$Sekunden; } $Jahr += 1900; if($Monat == 12){ $Monat = 1; } else{ $Monat++; } if($Monatstag < 10){ $Monatstag = "0".$Monatstag; } if($Monat < 10){ $Monat = "0".$Monat; } return $Monatstag.".".$Monat.".".$Jahr." ".$Stunden.":".$Minuten.":".$Sekunden; }
1
2
3
4
5
[job1]
timespec=* * * * * 0-59/10
name=Hoerer auf Verzeichnis - Dateien verschieben
system_str=C:\Scheduler\strawberry\perl\bin\wperl.exe
parameter=C:\Scheduler\to_execute_perl\listener_and_move.pl D:\backup D:\backup2
strftime "%d.%m.%Y %H:%M:%S", gmtime(time + 3600);