Seite 1 von 1

grep funktioniert über direkte Shell-Ausführung, aber nicht im Cronjob

Verfasst: 19.07.2013, 04:56
von rund
E
R
S
T
M
A
L

D
A
S

A
D

Hi,
ich brauch mal Anregungen, was das noch sein könnte.
In einem Perl-Script führe ich einen grep aus. Der grep funktioniert, wenn ich ihn direkt in der Shell (/bin/bash und /bin/sh) ausführe oder wenn ich das Perl-Script direkt starte, aber nicht, wenn das Perl-Script über einen Cronjob gestartet wird.

Ein anderer grep im selben Perl-Script funktioniert problemlos, der nicht funktionierende grep läuft ca. 15 Minuten (normal wären es etwas mehr), bringt aber kein Ergebnis zurück.

Folgender Perl-Code:

Code: Alles auswählen

my $grep_ios="cd ".$wm_conf_ce." && /bin/egrep \"^interface [a-Z]+ *[0-9\\/]+\" -A 20 -r * 2>&1 | /bin/egrep \"(:interface |- description|- (ip )?vrf|- ip(v6)? address|- +standby( +.*)? ipv6)\" 2>&1";
my @cmd_output=`$grep_ios`;
Aufgelöst:

Code: Alles auswählen

cd /home/ipc/conf-ce-current/ && /bin/egrep "^interface [a-Z]+ *[0-9\/]+" -A 20 -r * 2>&1 | /bin/egrep "(:interface |- description|- (ip )?vrf|- ip(v6)? address|- +standby( +.*)? ipv6)" 2>&1

Der funktionierende grep sieht nicht viel anders aus:

Code: Alles auswählen

my $grep_ios_wan="cd ".$wm_conf_ce." && /bin/egrep \"^ *(router bgp |address-family ipv[46] vrf |neighbor .* remote-as 20570)\" -r * 2>&1";
my @cmd_output=`$grep_ios_wan`;
Aufgelöst:

Code: Alles auswählen

cd /home/ipc/conf-ce-current/ && /bin/egrep "^ *(router bgp |address-family ipv[46] vrf |neighbor .* remote-as 20570)" -r * 2>&1


Cron-Eintrag:

Code: Alles auswählen

30 1,6,12 * * * /usr/bin/perl /home/ipc/CoPS/bin/agent_ip.pl >> /home/ipc/CoPS/logs/cronjob_ip 2>&1
"SHELL=/bin/bash" hab ich mal testweise bei Cron eingetragen, bringt aber keine Änderung.

Ideen?

Verfasst: 19.07.2013, 18:30
von inops
Vielleicht fehlt Cron die Berechtigung für die Verzeichnisse?
Die Scripte werden ja vermutlich mit der Berechtigung des Cron-Jobs ausgeführt?
Keine Ahnung unter welchem Benutzer die Cron-Jobs ausgeführt werden...

Verfasst: 20.07.2013, 15:19
von wildtollwut
Zunächst mal: wieso 'cd'? Du kannst grep auch ein Verzeichnis angeben, in dem gesucht werden soll. Warum leitest du stderr auf stdout um? Willst du in deinem verketteten grep auch mögliche Fehler durchsuchen?

Die Pipe ist m.E. nicht nötig - wenn du einfach zwei Suchmuster hast, kannst du dasselbe auch per -e 'pattern1' -e 'pattern2' erreichen.

Versuche als nächstes deine Befehle als root ("su -") auszuführen, System-Cronjobs laufen auch als root, und die Ausgabe anzuschauen.

Verfasst: 24.07.2013, 09:48
von rund
wildtollwut hat geschrieben:Zunächst mal: wieso 'cd'? Du kannst grep auch ein Verzeichnis angeben, in dem gesucht werden soll.
Ja, könnte man wohl auch.. Gewohnheit.
wildtollwut hat geschrieben:Warum leitest du stderr auf stdout um? Willst du in deinem verketteten grep auch mögliche Fehler durchsuchen?
Vermutlich kann ich stderr auch auf eine Logfile umleiten? Ich vermute dann mit "2>/home/user/log.txt" ? Hab ich noch nicht probiert, ich wollte die Fehler nur erstmal irgendwo abgefangen bekommen.
wildtollwut hat geschrieben:Die Pipe ist m.E. nicht nötig - wenn du einfach zwei Suchmuster hast, kannst du dasselbe auch per -e 'pattern1' -e 'pattern2' erreichen.
Wenn das zweite Suchmuster nur auf das Ergebnis des ersten Musters Zugriff hat funktioniert das wohl auch, hab's nicht getestet, würde aber vermuten, dass hier beide Suchmuster auf den gesamten Dateiinhalt angewendet werden.

@Topic:
Hab nun endlich herausgefunden, was das Problem ist!!
Ich weiß nicht warum, aber aus irgendeinem Grund funktioniert unter Cron der Pattern, bzw. die Zeichenklasse "[a-Z]" nicht. Sobald ich stattdessen [a-zA-Z] angebe geht es.
... man muss nicht alles verstehen.

Verfasst: 24.07.2013, 17:06
von fame
[a-Z] Ist das ein spezieller GNU Regex ausdruck? Bei Perl Regex gibt's das nicht, oder?!

Würde an deiner Steller immer [a-zA-Z] nutzen, ist übersichtlicher und sollte überall funktionieren.

Verfasst: 25.07.2013, 04:45
von rund
Doch, den gibt es auch in Perl (hab Regex erst über Perl gelernt).
Aber selbst wenn es ein Spezialausdruck wäre, so sollte doch zumindest Cron das gleiche können wie die normale User-Shell. Aber was solls... die Dinge an denen man so lange rumprobieren muss merkt man sich für die Zukunft.

Verfasst: 25.07.2013, 09:43
von fame
Natürlich unterstützt grep dieselben Optionen etc., egal ob du es in einem Skript direkt aufrufst oder durch Cron. Man müsste sich halt einmal genau angucken was da schief läuft.

Aber ehrlich gesagt will ich ungerne mehr als 30 Sekunden damit verschwenden über die Probleme eines Verrückten nachzudenken :( Frag doch mal deine Ma ob sie dir beim debuggen hilft, die scheint ein echter Geek zu sein.

Verfasst: 25.07.2013, 15:13
von rund
fame hat geschrieben:Aber ehrlich gesagt will ich ungerne mehr als 30 Sekunden damit verschwenden über die Probleme nachzudenken :(
Das verlange ich auch nicht. Wäre ganz interessant zu wissen, aber das Problem ist gelöst, das ist die Hauptsache.

Verfasst: 03.08.2013, 11:39
von factorx
Häufigster Fehler bei cronjobs die in der Shell zwar super, nicht aber im Cronjob funktionieren, sind wohl fehlende/falsche Umgebungsvariablen.