Schrift
[thread]6634[/thread]

Perl Script mit Cronjob?

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Gast Gast
 2005-01-18 15:13
#50817 #50817
Hallo ich habe hier ein Perl Script was auch so funktioniert, aber leider nicht im cronjob.

Ist vielleicht nicht das beste, aber es tut seinen dienst. Ich weiß nur nicht warum es nicht läuft wenn es als Cronjob deklariert ist?
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
61
62
63
64
65
use Date::Calc qw(Delta_Days);

my ($dir_date,$directory) = "";

my ($mday,$mon,$year) = (localtime(time-60*60*24*7*8))[3..5]; #get the current time minus 8 weeks (ca. 2 months)

#convert the strings into the right format
$year += 1900;
$mon += 1;

#if the length of the string mon and mday are only 1, add a leading 0
if (length($mon) == 1)
{
  $mon="0$mon";
}
if(length($mday) == 1)
{
  $mday="0$mday";
}

#get all the directory's from the startup_config
@configs = `ls -l /home/confbackup/startup_configs/`;

foreach (@configs)
{
if (!($_ =~ /total/))
{
$length = @informations = split (/\s/,$_); #split each line and get also the number of arguments splitted

$dir_date = $informations[$length-3]; #get the create date from the directory

$directory = $informations[$length-1]; #get the directory name
$directory = "/home/confbackup/startup_configs/".$directory; #add an absolute path to the directory

($dir_year,$dir_mon,$dir_mday) = split (/\-/,$dir_date);

#get the difference between the create_date of the directory and the date 8 weeks ago
$Dd = Delta_Days($dir_year,$dir_mon,$dir_mday,

$year,$mon,$mday);

#if the difference is positive, the directory is older than 8 weeks
if ($Dd > 0)
{
opendir(DIR,"$directory");
@files=readdir(DIR);
closedir(DIR);



#delete all files from the directory

foreach(@files)

{

unlink("$directory/$_");

}

#delete the directory itself
rmdir("$directory");
}
}
}


Es löscht einfach alle alle directory die älter als 8 Wochen sind.

Hoffe mir kann jemand helfen.
betterworld
 2005-01-18 15:30
#50818 #50818
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Achte doch mal auf die Rueckgabewerte von rmdir, opendir, unlink und so weiter. Vielleicht kannst Du auch mal erklaeren, was genau Du getan hast (crontab-Eintrag etc) und was genau dann passiert
GwenDragon
 2005-01-18 18:13
#50819 #50819
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
Und wo ist im Code das Shebang?
Cron kann auch wie die Shell nicht erraten, ums was für ein Skript es sich handelt.
Oder ruftst du in der crontab das Skript mit perl auf?
Taulmarill
 2005-01-18 18:50
#50820 #50820
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Quote
Es löscht einfach alle alle directory die älter als 8 Wochen sind.

verrätst du uns auch, was das script eigendlich tun sollte, oder muss ich wieder meine glaskugel hervorholen? :)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2005-01-18 19:01
#50821 #50821
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
80% aller Probleme bei cronjobs sind IMHO falsch gesetzte Umgebungsvariablen; dies scheint aber bei dir nicht der Fall zu sein.
10% sind fehlende Rechte; ueberpruefe die mal (execute-rechte fuer's script, shebang, rechte auf die verzeichnisse, ...)

Weiters ist mir aufgefallen, dass du weder beim opendir noch beim unlink noch beim rmdir eine Fehlerueberpruefung machst... ueberpruefe dort mal die returncodes, und wenn dann immer noch unerklaerliche probleme auftauchen, dann vergleiche mal die umgebungsvariablen (in %ENV)

z.B.
Code: (dl )
1
2
3
4
5
opendir (DIR, $directory) or die "Error: couldn't open dir '$directory': $!\n"
...
unlink ("$directory/$_") or warn "Error: couldn't unlink file '$directory/$_': $!\n";
...
rmdir ($directory) or warn "Error: couldn't unlink '$directory': $!\n";


weiters fuehrst du ein externes kommando mit backticks aus; da man damit nicht vernuenftig fehler abfangen kann, bevorzuge ich da pipe-open, z.B. anstelle von:
Code: (dl )
@configs = `ls -l /home/confbackup/startup_configs/`;

besser schreiben:
Code: (dl )
1
2
3
4
5
6
my $command = "ls -l /home/confbackup/startup_configs/";
unless (open(CMD, "$command |")) {
 die "Error in executing command: $!\n";
}
@configs = <CMD>; chomp(@confix);
close(CMD);


warum fuehrst du dafuer eigentlich ein externes kommando aus? kannst du das nicht mit perl-mitteln loesen? falls mal der output von ls ein bisschen anders als erwartet ist (z.B. auf einem anderen Betriebssystem oder einer anderen version), faellt das script unnoetigerweise auf die nase.\n\n

<!--EDIT|Strat|1106067773-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
format_c
 2005-01-18 23:42
#50822 #50822
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Bei dem Prüfscript von links.perl-community.de hatte, welches auch über cron gestartet wird, hatte ich anfangs auch solche probleme

Zu dem was Strat bereits gesagt hat musst du noch auf folgendes achten:
- Benutze FindBin oder absolute Pfadangaben
- Der Shebang muss stimmen bzw der aufruf des Interpreters muss auch absolut sein
- Wenn die Datei in der crontab über die absolute Pfadangabe über die Shebang aufgerufen wird, muss die Datei ausführ bar für alle sein.

Du kannst die unabhängige Ausführbarkeit deines scriptes so testen:
Code: (dl )
1
2
$ /pfad/zum/script > cd ../
$ /pfad/zum > /pfad/zum/script/script.pl


Gruß Alex
Ares
 2005-01-19 09:50
#50823 #50823
User since
2005-01-19
5 Artikel
BenutzerIn
[default_avatar]
Hallo, danke erstmal für die Antworten werde ich gleich mal probieren.

Erstmal Shebang ist gesetzt nur hab ich den beim kopieren nicht erwischt, deswegen steht der hier nicht drinnen.

Und mit dem "ls" Befehl stört es mich selber was, aber ich habe kein Kommando gefunden was das creat datum eines Verzeichnisses und/oder einer Datei zurückgibt. Oder aber ich habe es einfach übersehen.

Aber was mir noch Aufgefallen ist, das das Script nach
Code: (dl )
$Dd = Delta_Days($dir_year,$dir_mon,$dir_mday,$year,$mon,$mday);

abbricht. Dann denke ich kennt er den Befehl einfach nicht. Muss man dann auch noch bei einem Cronjob die ganzen Module absolut setzen? Weil bei einem anderen Script hatte ich auch Module eingebunden und da hat er nicht gemeckert.

MfG
ARES
format_c
 2005-01-19 10:09
#50824 #50824
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Brauchst du nicht. Es sei denn sie sind explizit außerhalb von @INC installiert worden.
`Wird das script nicht ausgeführt oder bricht es ab?

Gruß alex
renee
 2005-01-19 10:18
#50825 #50825
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Ares,19.01.2005, 08:50]Und mit dem "ls" Befehl stört es mich selber was, aber ich habe kein Kommando gefunden was das creat datum eines Verzeichnisses und/oder einer Datei zurückgibt. Oder aber ich habe es einfach übersehen.[/quote]
ls gibt doch auch nur das Datum der letzten Änderung an, oder irre ich mich?

Das Änderungsdatum kannst Du auch so bekommen:
Code: (dl )
my $last_modify = -M $file;
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/
Ares
 2005-01-19 10:37
#50826 #50826
User since
2005-01-19
5 Artikel
BenutzerIn
[default_avatar]
Quote
`Wird das script nicht ausgeführt oder bricht es ab?

Das script bricht ab.
Ich habe einfach mal nach den wichtigen stellen eine Ausgabe gemacht und dann festgestellt das es genau nach dieser Zeile abbricht.

MfG
ARES
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-01-18 15:13.