318 Stimmen

Wie schreibe ich ein Bash-Skript, um einen Prozess neu zu starten, wenn er stirbt?

Ich habe ein Python-Skript, das eine Warteschlange überprüft und eine Aktion auf jedem Element durchführen wird:

# checkqueue.py
while True:
  check_queue()
  do_something()

Wie schreibe ich ein Bash-Skript, das überprüft, ob es läuft, und wenn nicht, es startet. Ungefähr der folgende Pseudocode (oder vielleicht sollte es etwas tun wie ps | grep ?):

# keepalivescript.sh
if processidfile exists:
  if processid is running:
     exit, all ok

run checkqueue.py
write processid to processidfile

Ich rufe das über eine crontab auf:

# crontab
*/5 * * * * /path/to/keepalivescript.sh

6voto

clofresh Punkte 1335

Sie sollten monit verwenden, ein Standard-Unix-Tool, das verschiedene Dinge auf dem System überwachen und entsprechend reagieren kann.

Aus den Unterlagen: http://mmonit.com/monit/documentation/monit.html#pid_testing

check process checkqueue.py with pidfile /var/run/checkqueue.pid
       if changed pid then exec "checkqueue\_restart.sh"

Sie können monit auch so konfigurieren, dass Sie eine E-Mail erhalten, wenn es einen Neustart durchführt.

5voto

soulmerge Punkte 70900
if ! test -f $PIDFILE || ! psgrep `cat $PIDFILE`; then
    restart_process
    # Write PIDFILE
    echo $! >$PIDFILE
fi

4voto

Daniel Bradley Punkte 86

Ich bin mir nicht sicher, wie portabel es unter verschiedenen Betriebssystemen ist, aber Sie könnten überprüfen, ob Ihr System den Befehl "run-one" enthält, d.h. "man run-one". Dieser Befehlssatz enthält insbesondere "run-one-constantly", was genau das zu sein scheint, was benötigt wird.

Aus der Manpage:

run-one-constantly COMMAND [ARGS]

Hinweis: Natürlich kann dies auch von Ihrem Skript aus aufgerufen werden, aber es macht auch ein Skript überflüssig.

1voto

Kevin Wright Punkte 49145

Ich habe das folgende Skript mit großem Erfolg auf zahlreichen Servern eingesetzt:

pid=`jps -v | grep $INSTALLATION | awk '{print $1}'`
echo $INSTALLATION found at PID $pid 
while [ -e /proc/$pid ]; do sleep 0.1; done

Anmerkungen:

  • Es wird nach einem Java-Prozess gesucht, also habe ich jps verwenden kann, ist dies viel konsistent über alle Distributionen hinweg als ps
  • $INSTALLATION so viel vom Prozesspfad enthält, dass er völlig eindeutig ist
  • Verwenden Sie sleep, während Sie darauf warten, dass der Prozess stirbt, um keine Ressourcen zu verbrauchen :)

Dieses Skript dient eigentlich dazu, eine laufende Instanz von Tomcat herunterzufahren, die ich über die Befehlszeile herunterfahren (und warten) möchte, so dass das Starten als untergeordneter Prozess einfach keine Option für mich ist.

1voto

BitDEVil2K16 Punkte 308

Ich verwende dies für meinen npm-Prozess

#!/bin/bash
for (( ; ; ))
do
date +"%T"
echo Start Process
cd /toFolder
sudo process
date +"%T"
echo Crash
sleep 1
done

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X