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_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