#!/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(){ $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; }