Script funktioniert nicht mit cron
-
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.