Script funktioniert nicht mit cron
-
Hallo,
ich habe ein Script einen Prozess überprüft, ob dieser läuft.
Wenn nicht wird das init-Script neu gestoppt und danach neu gestartet.
/etc/init.d/daemon stop -> pause -> /etc/init.d/daemon startWenn ich das Überwachungsscript von der Konsole starte dann funktioniert alles.
Jedoch wenn das Script im cronjob läuft funktioniert das Script nicht, obwohl das Script laut Email Fach ausgeführt wird. Ich bekomme auch in der /var/log/messages keinen Hinweis wegen eines Fehlers.Hier mein cron-Eintrag in der Datei /var/spool/cron/tabs/root
*/30 * * * * root /usr/zusatz/ckeck_prozess/check_usv_prozess.pl
Die cron Datei wird bearbeitet da noch andere jobs richtig funktionieren.
Bin für jeden Tip dankbar.
Gruß
worst_case
-
worst_case schrieb:
Jedoch wenn das Script im cronjob läuft funktioniert das Script nicht, obwohl das Script laut Email Fach ausgeführt wird.
Wodran erkennst du, dass es nicht funktioniert? Und wodran, dass es ausgeführt wird?
Wenns im cron nicht läuft liegt es meistens an der Umgebung (also PATH etc)...
-
Hallo,
hier mein Script. Ich habe alle Befehle mit vollem Path angegeben, somit sollte die "path" variable keine Rolle spielen.
Wenn das Script funktioniert wird der daemon wieder gestartet.#!/usr/bin/perl -w use strict; my @prozess = ('upsman','upstcp','upshttpd','upsagent'); my $startscript ="/etc/init.d/upsman"; for my $p (@prozess) { my $pn = `/usr/bin/pgrep $p`; if ($pn ne "") {next;} else { `$startscript stop`; sleep 5; system("$startscript start >/dev/null"); exit; } }
Gruß
worst_case
-
Benutzt du
crontab -e
? Was ist das "root" vor dem Befehl?
-
Hallo,
nein ich erstelle die cron normal mit Editor.
Und root ist der Benutzer.worst_case
-
Ich würde dir empfehlen
crontab -e
zu benutzen. Das überprüft nämlich auch gleich deine Eingaben.Zum "debuggen" kannst du ja mal die gesamte Ausgabe mit
&> /tmp/cron.log
umleiten und anschaun.
Kannst ja auch das Interval von alle 30 Minuten etwas höher setzen, zum Testen.
Also/tmp/cron.log
sollte auf jedenfall nach dem Ausführen angelegt sein. Ob allerdings etwas drinsteht ist eine andere Sache.
-
worst_case schrieb:
Hallo,
hier mein Script. Ich habe alle Befehle mit vollem Path angegeben, somit sollte die "path" variable keine Rolle spielen.
Wenn das Script funktioniert wird der daemon wieder gestartet.#!/usr/bin/perl -w use strict; my @prozess = ('upsman','upstcp','upshttpd','upsagent'); my $startscript ="/etc/init.d/upsman"; for my $p (@prozess) { my $pn = `/usr/bin/pgrep $p`; if ($pn ne "") {next;} else { `$startscript stop`; sleep 5; system("$startscript start >/dev/null"); exit; } }
Gruß
worst_caseVersuch es mal damit:
#!/bin/bash prozesse=(upsman upstcp upshttpd upsagent) for prozess in "${prozesse[@]}"; do if ! /etc/init.d/"$prozess" status; then /etc/init.d/"$prozess" stop sleep 5 /etc/init.d/"$prozess" sart fi done
Und in die Crontab:
0 * * * * (/usr/bin/env /path/to/script) >> /tmp/startup.log 2>&1
-
Also das Script macht was anderes.
Er hat wohl einen Dienst (upsman) der mehrere Prozesse startet (upsman, upstcp, upshttpd, upsagent). Sollte jetzt einer der Prozesse fehlen, soll alles gestoppt werden und der Dienst dann neu gestartet werden.
Wenn dann hätte ich sowas vorgeschlagen:#!/bin/bash # umgebung laden? eval "$(env)" for p in upsman upstcp upshttpd upsagent do if ! killall -0 "$p" &> /dev/null then echo "$(date): $p fehlt, starte neu..." /etc/init.d/upsman stop sleep 5 /etc/init.d/upsman start # wieso nicht einfach restart? break fi done
mit
*/30 * * * * /path/to/script >> /tmp/cron.log 2>&1
Nuja, mal abwarten, was worst_case noch sagt
-
Hallo,
ich habe nun das "bash-Script" bzw. mein Scrip mit Aufruf von "/usr/bin/env", sowie im cron ohne user (root) Eintrag umgeschrieben
Beide Scripte (bash und perl) funktionieren halbwegs und zeigen nun das gleiche verhalten.
Es wir eine /tmp/cron.log erzeugt.
MAILTO=root SHELL=/bin/sh USER=root PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin PWD=/root SHLVL=1 HOME=/root LOGNAME=root _=/srv/zusatz/check_prozess/check_usv_prozess.pl Stop UPS-Monitor upsman: not in progress Starting UPS-Monitor ..done
Leider wird aber nur ein Daemon gestartet, obwohl es nach manueller Eingabe von /etc/init.d/upsman stop -> start 4 Prozesse sein müssten.
d.h. wenn ich vom "Überwachungsscript" /etc/init.d/upsman stop danach start
erledigen lasse, hat das nicht die gleiche Auswirkung als wenn ich dies per Hand in der Konsole erstelle.Warum ?????
Gruß
wosrt_case
-
Poste doch mal das upsman init-script hier.
-
Hallo,
anbei das Startscript
#!/bin/sh # # [ -x /usr/ups/upsman ] || exit 0 . /etc/rc.status rc_reset # echo "Starting UPS-Monitor" # [ -x /usr/ups/upsman ] UPSAGT_AGENTX="no" export UPSAGT_AGENTX UPSAGT_PORT=1161 export UPSAGT_PORT PATH=/sbin:/usr/sbin:/bin:/usr/bin case "$1" in start) echo "Starting UPS-Monitor" cd /usr/ups [ -x upsman ] rc_status -v upsmanpid=`ps -e | awk '$4 ~ /upsman/ && $4 !~ /[0-9]/ && $2 ~ /[?|-]/ { print $1 }'` [ -z "${upsmanpid}" ] && ./upsman && ./upstcp if [ -x ./upshttpd ]; then upshttpdpid=`ps -e | awk '$4 ~ /upshttpd/ { print $1 }'` [ -z "${upshttpdpid}" ] && ./upshttpd >/dev/null 2>&1 fi if [ -x ./upsagent ]; then upsagentpid=`ps -e | awk '$4 ~ /upsagent/ { print $1 }'` [ -z "${upsagentpid}" ] && ./upsagent fi ;; stop) echo "Stop UPS-Monitor" cd /usr/ups upsmanpid=`ps -e | awk '$4 ~ /upsman/ && $4 !~ /[0-9]/ && $2 ~ /[?|-]/ { print $1 }'` [ -x ./upshttpd ] && upshttpdpid=`ps -e | awk '$4 ~ /upshttpd/ { print $1 }'` [ -x ./upsagent ] && upsagentpid=`ps -e | awk '$4 ~ /upsagent/ { print $1 }'` [ -n "${upsmanpid}" ] && ./upsman -s [ -n "${upshttpdpid}" ] && kill ${upshttpdpid} [ -n "${upsagentpid}" ] && kill ${upsagentpid} ;; *) echo "Usage: $0 start|stop"; exit 1 ;; esac exit 0
Gruß
worst_case
-
Füg doch mal im Script vor dem stop, zwischen stop und start und nach start folgendes ein:
ps -e | grep ups
Das sollte dir die Prozesse in deinen Log schreiben.
-
Hallo,
die logdatei hat folgenden Inhalt.
3695 Stop UPS-Monitor upman: not in progress 3695 Starting UPS-Monitor ..done 3695 30094
Wobei der Prozess 3695 nicht dazugehört (cupsd)
Es wird somit nur ein Prozess und zwar upshttpd (30094) geladen.
Starte ich mein Script von der Konsole (gleicher Aufruf wie cron) dann werden alle Prozesse gestartet und die zeigt auch die Prozess-ID in der logdatei.Ich werde noch wahnsinnig
Gruß
worst_case
-
Änder die erste Zeile mal zu /bin/sh -x, dann kannst du den Programmverlauf in der Logdatei sehen, gibt ggf. aufschlüsse darüber.