Optimierung von Prozessabfrage - cron

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tanita
Beiträge: 78
Registriert: 14.08.2003 13:45:27
Wohnort: Muc
Kontaktdaten:

Optimierung von Prozessabfrage - cron

Beitrag von tanita » 09.08.2005 23:06:17

Hallo,

bin gerade dabei einen lokalen Debian-Mirror zu ziehen. Da die Verbindung manchmal abschmiert, habe ich auf die Schnelle folgendes für die crontab produziert :?

Code: Alles auswählen

#!/bin/bash

SKRIPT=test-sync-deb_mirror.sh

if ps ax|grep test-sync |grep -v grep
        then echo "`date`: ok!" >> /var/log/cron_mirror.log
else
        pkill debmirror
        rm nohup.out
        nohup sh /root/$SKRIPT &
        echo "`date`: Skript ($SKRIPT) neu gestartet!" >> /var/log/cron_mirror.log
fi
Kann man das so lassen, oder wie kann man das eleganter lösen?

Danke,
Servus T.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 10.08.2005 07:55:33

drei kleinere Kritikpunkte hätte ich:
a) du hast eine Variable SCRIPT, setzt sie aber nicht konsequent ein
b) zum pkill gibt es auch ein pgrep dieses könntest du statt der Wurscht "ps ax | grep ..." verwenden
c) das Script könnte mit "pkill debmirror" den falschen Prozeß killen

ungetestet:

Code: Alles auswählen

#!/bin/bash

SCRIPTDIR=/root
SCRIPTNAME=test-sync-deb_mirror.sh
LOG=/var/log/cron_mirror.log

PID=`pgrep -f "$SCRIPTDIR/$SCRIPTNAME"`
if [ -n "$PID" ]; then
  echo "`date`: ok!" >> $LOG
else
  #kill $PID
  rm nohup.out
  nohup sh $SCRIPTDIR/$SCRIPTNAME &
  echo "`date`: Skript ($SCRIPTNAME) neu gestartet!" >>$LOG
fi
Gruß
gms

tanita
Beiträge: 78
Registriert: 14.08.2003 13:45:27
Wohnort: Muc
Kontaktdaten:

Beitrag von tanita » 10.08.2005 08:23:58

Moin,

hab gestestet, dein Vorschlag läuft an sich. Aber den 'pkill debmirror' habe ich deshalb gemacht, wenn mir aus irgendwelchen Gründen das Skript test-sync-deb_mirror.sh abschmiert (welches debmirror aufruft), läuft trotzdem debmirror weiter.

Kann man das irgendwie verunden? Z.B. so

Code: Alles auswählen

PID=`pgrep -f "$SCRIPTDIR/$SCRIPTNAME"`
PID_deb=`pgrep -f debmirror`

if [ -n "PID" && "PID_deb"]; then...
Kann es eben sofort nicht mehr testen, weil der Mirror momentan komplett gezogen ist..

2. Frage, falls pgrep debmirror mehrere PIDs ausgibt, kann man die auch abfangen und dann killen, z.B. in einem Array? Könnte das in einem anderen Skript gebrauchen..
Danke,
Servus T.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 10.08.2005 08:59:30

so könntest du überprüfen, ob dein Script lauft und debmirror als Child vorhanden ist:

Code: Alles auswählen

PID=`pgrep -f "$SCRIPTDIR/$SCRIPTNAME"` 
if [ -n "$PID" ]; then...
  PID_deb=`pgrep -P "$PID" -f debmirror` 
fi

if [ -n "$PID" && "$PID_deb"]; then...
  # alles ok
else
das Problem scheint aber der Fehlerfall zu sein. Wenn ich dich richtig verstanden habe, gibt es Fälle, wo dein Script terminiert ist und debmirror noch hängt. Der müßte dann also 1 als Parentpid haben. Du kannst also "pkill -P 1 debmirror" verwenden

Wenn debmirror ganz am Ende deines Scripts aufgerufen wird, könntest du ihn auch mit "exec" starten. Das hat dann einerseits den Vorteil, daß du nicht den unnötigen Shell-Prozeß herumhängen hast und erleichtert die Überprüfung und das Abschießen.

Gruß
gms

Antworten