Script läuft manuell aber nicht als cronjob

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hoeffy
Beiträge: 4
Registriert: 11.03.2011 22:44:15

Script läuft manuell aber nicht als cronjob

Beitrag von hoeffy » 11.03.2011 22:56:47

Hi ihr alle,

ich würde gerne ein Script haben, dass alle 10 Minuten nachguckt, ob postfix noch läuft und wenn das nicht so ist, den Dienst startet.

als root:

Code: Alles auswählen

ps a -N | grep -c postfix
Gibt mir ne 1, wenn er läuft und ne 0, wenn er nicht läuft.

auch als root (Recht 755):

Code: Alles auswählen

#!/bin/sh
logfile=/var/log/postfix_check.log

if [ $(/bin/ps a -N | /bin/grep -c postfix) = 0 ];
then
    echo "$(date) Postfix Restart" >> $logfile
    /etc/init.d/postfix start
else
    echo "$(date) Postfix OK" >> $logfile
fi
Funktioniert super. Wenn postfix nicht läuft, wird das in die Log-Datei geschrieben und der Dienst wird gestartet.
Ansonsten schreibt er mir auch (nur zum Test) in die Datei, wenn der Dienst läuft.

Wenn ich jetzt aber in die crontab von root reinschreibe, dass die Datei alle 10 Minuten ausgeführt werden soll, schreibt mir das Script alle 10 Minuten, dass postfix läuft. Auch, wenn ich postfix beendet habe.

Wenn ich das Script per Hand ausführe, schreibt er mir das deutsche Datum in die Log-Datei. Wenn es über die crontab läuft, schreibt er mir das englische Datum in die Datei. Mir persönlich egal aber vielleicht gibts da nen Zusammenhang.

crontab -e

Code: Alles auswählen

SHELL=/bin/bash
PATH=/bin:usr/bin:/usr/sbin:
HOME=/root
*/10 * * * * /var/run/postfix_check
Viele Grüße,
hoeffy :?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Script läuft manuell aber nicht als cronjob

Beitrag von rendegast » 12.03.2011 08:29:06

Code: Alles auswählen

ps a -N | grep -c postfix
findet sich selbst, also immer.

Alternativ

Code: Alles auswählen

pidof postfix


deutsch <-> englisch
cron-Jobs laufen unter einem eigenen minimalen Environment,
baue mal

Code: Alles auswählen

set
locale
in Dein Skript.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

hoeffy
Beiträge: 4
Registriert: 11.03.2011 22:44:15

Re: Script läuft manuell aber nicht als cronjob

Beitrag von hoeffy » 13.03.2011 20:27:16

Bei pidof bekomme ich immer eine 0 als Ergebnis. :-(

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Script läuft manuell aber nicht als cronjob

Beitrag von rendegast » 13.03.2011 21:58:47

Dann läuft postfix,
hier ein Beispiel:

Code: Alles auswählen

$ pidof nix ; echo $?
1
Resp. wie sieht Dein Test jetzt aus?

Code: Alles auswählen

if [ $(/bin/ps a -N | /bin/grep -c postfix) = 0 ];
then
    echo "$(date) Postfix Restart" >> $logfile
    /etc/init.d/postfix start
else
    echo "$(date) Postfix OK" >> $logfile
fi

->

pidof postfix || {
    echo "$(date) Postfix Restart" >> $logfile
    /etc/init.d/postfix start
}
EDIT Es muß nach den Beispielen hierunter wohl 'pidof master' heißen.



Deinen Test hast Du nicht richtig verstanden:

Code: Alles auswählen

    ps a -N | grep -c postfix
Gibt mir ne 1, wenn er läuft und ne 0, wenn er nicht läuft.
Dazu 'man grep':

Code: Alles auswählen

       -c, --count
              Suppress normal output; instead print a count of matching lines for each input file.  With the
              -v, --invert-match option (see below), count non-matching lines.  (-c is specified by POSIX.)
Wenn er keine Line mit postfix findet, gibt er also die Anzahl "0" aus.
Ein Problem gibt es jedoch dadurch, daß das Skript offenbar "postfix_check" heißt.
Dadurch gibt der Test IN postfix_check wieder eine 1 aus, die Line mit "postfix_check" halt.




Jedoch glaube ich, daß die postfix-Prozesse gar nicht "postfix" heißen, Bsp.:

Code: Alles auswählen

    |-master-+-pickup
    |        `-qmgr

Code: Alles auswählen

     ├─master─┬─anvil
     │        ├─cleanup
     │        ├─local
     │        ├─pickup
     │        ├─qmgr
     │        ├─smtp
     │        ├─2*[smtpd]
     │        └─tlsmgr

Code: Alles auswählen

|-master-+-bounce
| |-2*[cleanup]
| |-3*[local]
| |-nqmgr
| |-pickup
| |-showq
| |-9*[smtp]
Zuletzt geändert von rendegast am 15.03.2011 12:14:44, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

hoeffy
Beiträge: 4
Registriert: 11.03.2011 22:44:15

Re: Script läuft manuell aber nicht als cronjob

Beitrag von hoeffy » 15.03.2011 11:23:11

Habe letzte Nacht mit "pidof" herum gespielt.
Leider zeigt mir pidof immer an, dass der Dienst nicht läuft.
Im Gegensatz zu "ps", wo mir halt gesagt wird, dass der DIenst immer läuft.

Ne ganz andere Idee:
Auf dem Server läuft auch Nagios.
Nagios benachrichtigt mich halt, wenn ein Dienst ausfällt. Könnte ich ihm dann nicht auch sagen, dass er den Dienst neu starten soll?
Wenn ja, wie?

Sorry für die blöden Fragen aber ich habe nur sehr wenig Ahnung von Linux.

Danke!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Script läuft manuell aber nicht als cronjob

Beitrag von rendegast » 15.03.2011 12:26:53

Leider zeigt mir pidof immer an, dass der Dienst nicht läuft.
Im Gegensatz zu "ps", wo mir halt gesagt wird, dass der DIenst immer läuft.
Ich habe oben dargelegt, daß es keinen Dienst "postfix" gibt.
Also zBsp. 'pidof master' statt 'pidof postfix'.
Schau Dir das selbst an in 'top' oder besser noch 'htop' (mit Baumdarstellung 't').

Bei Deinem ursprünglichen Test findest Du nicht den "postfix"-Prozeß:

Code: Alles auswählen

$ pstree
init─┬─acpid
...
     ├─master─┬─pickup
     │        └─qmgr


# ps a -N | grep post
 6556 ?        Ss     0:00 /usr/lib/postfix/master
"postfix" taucht als Teil des Pfadnamens von 'master' auf.


Nicht wie von mir vermutet, daß das Skript oder der "grep postfix" im ps auftaucht,
daß passiert mit anderen ps-Optionen:

Code: Alles auswählen

$ cat /tmp/postfix_check.sh 
#!/bin/sh
ps a -F | grep postfix

$ /tmp/postfix_check.sh
user 28539 11265  0   449   492   1 16:09 pts/3    S+     0:00 /bin/sh /tmp/postfix_check.sh
user 28541 28539  0   980   756   1 16:09 pts/3    S+     0:00 grep postfix



Oder so:
# ps -A -F | grep postfix
root      6556     1  0  1456  1788   0 15:53 ?        00:00:00 /usr/lib/postfix/master
postfix   6562  6556  0  1460  1724   1 15:53 ?        00:00:00 pickup -l -t fifo -u -c
postfix   6563  6556  0  1471  1748   1 15:53 ?        00:00:00 qmgr -l -t fifo -u
root     32249 25374  0  1326   724   1 16:15 pts/5    00:00:00 grep postfix
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

hoeffy
Beiträge: 4
Registriert: 11.03.2011 22:44:15

Re: Script läuft manuell aber nicht als cronjob

Beitrag von hoeffy » 16.03.2011 09:47:31

Hi rendegast,

danke für deine Hilfe. :THX:
Ich suche jetzt nach "postfix/master". Damit funktioniert es.

Code: Alles auswählen

#!/bin/sh
logfile=/var/log/smtp_check.log

if [ $(/bin/ps aux | /bin/grep -c postfix/master) = 2 ];
then
    echo "$(date) Postfix OK" >> $logfile
else
    echo "$(date) Postfix ERROR" >> $logfile
    if [ -f /var/run/smtp_check_file ]
	then
	    echo "$(date) SMS nicht verschickt" >> $logfile
	else
	    /storage/home/ich/gmxsms/smsmngr.py 01701234567 SMTP Dienst gestartet
	    echo "$(date) SMS verschickt" >> $logfile
	    touch /var/run/smtp_check_file
    fi
fi
Beim Verschicken der SMS per cronjob bekomme ich zwar noch einen Fehler aber das ist erstmal nebensächlich.

Danke,

hoeffy

Antworten