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 start

    Wenn 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_case

    Versuch 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.


Anmelden zum Antworten