Thread Wenn Perl-Skript beendet wird, Subroutine noch ausführen
(17 answers)
Opened by Gustl at 2012-11-20 12:02
Hallo,
ich habe nun das Skript folgendermaßen abgeändert: Code (perl): (dl
)
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; } Ich habe nur einen Cronjob in der scheduler.ini: Code: (dl
)
1 [job1] Es funktioniert auch soweit, nur wenn ich dann nach ca. 1h oder 1,5h auf dem PC schaue ist der Task dann beendet... Ich starte es mit wperl.exe -> umbenannt in perl-scheduler.exe. Hat wer eine Idee warum das Programm einfach beendet wird? BS ist Windows. Bin für jeden Tipp dankbar. Gruß modedit Editiert von GwenDragon: CODE-Tags für cron-Job Last edited: 2012-12-21 12:53:59 +0100 (CET) |