Schrift
[thread]911[/thread]

Perlscript für Cronjob Abfolge



<< >> 10 Einträge, 1 Seite
Channel
 2007-04-02 16:05
#9866 #9866
User since
2007-04-02
4 Artikel
BenutzerIn
[default_avatar]
Hallo Perl Community,

ich habe ein kleines Script was aus einer .txt Datei Cronjobs ausliest und diese nacheinander abarbeitet. Bevor nicht jeder Cronjob erledigt ist wird der nächste nicht begonnen.

Soviel zur Theorie. In der Praxis allerdings funktioniert das ganze nicht, es erscheint immer die Fehlermeldung: not working.

Das Script:

Code: (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
#!/usr/bin/perl
print "Content-type: text/html\n\n";
use CGI qw/:cgi-lib/;
use CGI::Carp qw(fatalsToBrowser);
%FORM=Vars();

#Instructions
##################

#Set this to the server path to the crons.txt
$pathtocrontxt="/var/www/vhosts/mydomain/cgi-bin/crons.txt";
# In the crons.txt put the first line as 0 and then put each cronjob on a seperate line below
# set the chmod permissions to crons.txt to 777 and cron.cgi to 755








#####################################
print "Running Crons...\n";
open(INF,"$pathtocrontxt") or print "couldnt open file";
@commands=<INF>;
close(INF);
foreach $line(@commands){
chomp($line);
if($line == 0){
print "not working\n";
@commands[0]="1\n";
open(OUTF,">$pathtocrontxt");
foreach $command(@commands){
print OUTF "$command";
}
close(OUTF);
}
elsif($line == 1){
print "working";
exit;

}
else {
print "Executing: $line\n";
$output=system("$line");
print "$output\n";
}





}
@commands[0]="0\n";
open(OUTF,">$pathtocrontxt");
foreach $command(@commands){
print OUTF "$command";
}
close(OUTF);
print "\n\nDone!\n";


Die .txt Datei:

Code: (dl )
1
2
3
4
0
/usr/bin/php /var/www/vhosts/domain/httpdocs/do-it/index.php
/usr/bin/php /var/www/vhosts/domain/httpdocs/do-it1/index.php
/usr/bin/php /var/www/vhosts/domain/httpdocs/do-it2/index.php


Das Script hier wird korrekt aufgerufen, nur die crons werden nicht abgearbeitet. Die Pfade habe ich alle korrekt angegeben.
Wo kann der Fehler stecken?

Danke.
Channel
renee
 2007-04-02 16:28
#9867 #9867
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ein paar allgemeine Hinweise:

*) Du solltest unbedingt Wiki:[tt]use strict[/tt] verwenden

*) Du solltest use warnings verwenden.

*) Ein Element eines Arrays wird so angesprochen: $array[$index]. Wie Du vielleicht siehst, wurde das @ durch ein $ ersetzt.

*) Du solltest die 3-Arg-Form von open verwenden. Also aus:
Code: (dl )
open(OUTF,">$pathtocrontxt")

das hier machen:
Code: (dl )
open(OUTF,">",$pathtocrontxt)


*) Du solltest Fehlerbehandlung machen:
Code: (dl )
open(OUTF,">",$pathtocrontxt) or die $!;


*) Du machst einen numerischen Vergleich ($line == 0), aber in $line steht ja meistens ein String. Deshalb besser den String-Vergleich verwenden: $line eq $irgendwas.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-04-02 16:33
#9868 #9868
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
*) Bekommst Du eine Fehlermeldung?

*) Was ist die genaue Ausgabe auf der Konsole?

*) Wenn Du es als CGI aufrufst, musst Du einen Header senden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Channel
 2007-04-02 16:52
#9869 #9869
User since
2007-04-02
4 Artikel
BenutzerIn
[default_avatar]
Die Bestätigungsmail von meinem Webserver sieht wie folgt aus, das ist dann auch zugleich die Fehlermeldung. Die Mail erhalte ich nachdem das Script per Cron ausgeführt wurde.
Code: (dl )
1
2
3
4
5
6
7
8
Content-type: text/html

Running Crons...
not working
not working


Done!
renee
 2007-04-02 17:00
#9870 #9870
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schonmal geschaut, ob in @commands auch tatsächlich das drinsteht was Du willst?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Channel
 2007-04-02 17:15
#9871 #9871
User since
2007-04-02
4 Artikel
BenutzerIn
[default_avatar]
Ja, mehrfach. Erst habe ich es in der .txt direkt über den Serverpfad versucht:
Code: (dl )
/usr/bin/php /var/www/vhosts/domain/httpdocs/do-it/index.php


danach auch über die Webadresse:
Code: (dl )
curl http://domain.com/do-it/index.php /dev/null


Beides funktioniert nicht. Ohne das zwischengeschaltete Script wird die do-it/index.php korrekt aufgerufen, per Cron. Schalte ich das Perl Script dazwischen erhalte ich nur die Fehlermeldung in der Bestätigungsmail.

Ist Dir bekannt wo es ein änliches Script für diesen Zweck funktionsfähig gibt? Hab schon alles abgesucht aber ohne Erfolg bisher.
renee
 2007-04-02 17:48
#9872 #9872
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Probier mal:
Code: (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
#!/usr/bin/perl

use strict;
use warnings;
use CGI qw/:cgi-lib :standard/;
use CGI::Carp qw(fatalsToBrowser);

print header;

#Instructions
##################

#Set this to the server path to the crons.txt
my $pathtocrontxt="./cron.txt";
# In the crons.txt put the first line as 0 and then put each cronjob on a seperate line below
# set the chmod permissions to crons.txt to 777 and cron.cgi to 755

my @commands;
my $lines = 0;
#####################################
print "Running Crons...\n";
if( open my $inf,"<",$pathtocrontxt ){
@commands = <$inf>;
close $inf;
chomp @commands;

for my $line(@commands){
if( $lines == 0 && $commands[$lines] == 0 ){
print "not working\n";
$commands[0] = 1;
write_file();
}
elsif($lines == 0 && $commands[$lines] == 1){
print "working\n";
$commands[0] = 0;
write_file();
exit;
}
else {
print "Executing: $line\n";
my $output = system("$line");
print "$output\n";
}

$lines++;
}

$commands[0] = 0;
}

print "\n\nDone!\n";

sub write_file{
if( open my $out, '>', $pathtocrontxt ){
print $out $_,"\n" for @commands;
}
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Channel
 2007-04-02 18:41
#9873 #9873
User since
2007-04-02
4 Artikel
BenutzerIn
[default_avatar]
Weltklasse. Klappt!

Vielen Dank.
Petrovich
 2007-04-02 19:38
#9874 #9874
User since
2007-03-28
1 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
my $output = system("$line");
print "$output\n";


Dies hier funktioniert übrigens nicht. system() gibt den Status vom wait() Call zum aufgerufenen Commando zurück, nicht dessen Ausgabe. Hinzu kommt, dass mit dem obigen Code keine Fehler abgefangen werden.

Besser:

Code: (dl )
1
2
3
4
5
6
if(! system("$line") ) {
print "$line executed successfully!\n";
}
else {
print "Failed to execute $line, Exitcode: " . $? >> 8;
}


Um STDOUT und STDERR abzufangen und gleichzeitig auf Fehler aufzupassen empfiehlt sich IPC::Open3.\n\n

<!--EDIT|Petrovich|1175528357-->
renee
 2007-04-02 19:59
#9875 #9875
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja gut, Du kannst den Rückgabewert von system genauer auswerten. Ich weiß ja nicht, ob es gewollt ist, die Ausgabe des Skript aufzufangen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-04-02 16:05.