Thread Wenn Perl-Skript beendet wird, Subroutine noch ausführen (17 answers)
Opened by Gustl at 2012-11-20 12:02

Gustl
 2012-12-21 12:41
#164352 #164352
User since
2011-01-27
441 Artikel
BenutzerIn
[Homepage]
user image
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
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


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)

View full thread Wenn Perl-Skript beendet wird, Subroutine noch ausführen