Wie kann ich einen Prozess nach dessen Beendigung automatisch neu starten?

11

Ich habe ein Golang-Programm, das ich neu starten möchte, nachdem es auf einer Debian Squeeze-Box beendet wurde. Das Ding dient HTTP hinter einem Apache 2 mod_proxy Setup. Ich erwarte nicht, dass der Prozess fehlschlägt, aber ich hätte gerne eine Versicherung dagegen.

Unter Ubuntu hätte ich upstart verwendet, um den Prozess am Leben zu erhalten. Debian mag Upstart nach meinem Verständnis nicht, da es ein Init-Ersatz ist.

Gibt es eine Alternative, die einen oder mehrere Prozesse nach deren Beendigung neu startet, die auf Squeeze funktioniert und mit init gut funktioniert?

Gelöscht
quelle
Würden Sie bitte Ihre Frage umformulieren? Möchten Sie einen Prozess neu starten, nachdem er beendet wurde?
Mailq
Ich möchte einen Prozess automatisch neu starten, wenn er fehlerhaft ist oder sich selbst beendet.
Gelöscht
2
Das traditionelle Init- Programm macht genau das. Warum die Leute dachten, es wäre eine gute Idee, init zu verwenden, um ein Shell-Skript auszuführen, das ein Shell-Skript aufruft, das einen anderen Prozess startet, der dasselbe tut, aber ohne eine automatische Kernel-Panik und einen Neustart, sollte dieser Prozess jemals fehlschlagen, ist mir völlig unverständlich.
Simon Richter
Das ist ein fairer Punkt. Ich werde auch nur mit init untersuchen. Ich packe die Software mit dpkg, daher sollte das Erstellen von Init-Skripten keine Schwierigkeit sein.
Gelöscht

Antworten:

10

Der beste Weg dafür sind die daemontools. Mit ihnen können Sie Prozesse überwachen und erneut starten.

Siehe die Dokumentation auf ihrer Website: http://cr.yp.to/daemontools.html

mailq
quelle
1
Danke - genau danach bin ich. DJB = in der Regel gut. Ich hätte mich eigentlich daran erinnern sollen, dass es was gab, wenn ich 5 Jahre lang für qmail gesorgt habe!
Gelöscht
Das gleiche gilt für mich, außer dass ich mich einige Zeit um DJBDNS gekümmert habe.
mr.b
10

Supervise ist eine leichte und effiziente Alternative. Unter Debian ist es in Daemontools verpackt . Sie können auch diese verwandte Frage lesen , in der einige Kritikpunkte für die Überwachung aufgeführt sind, und die einen Neustart als weitere Möglichkeit erwähnt.

Wenn Sie etwas unglaublich Einfaches einrichten möchten, habe ich mit monit großen Erfolg gehabt . Es ist auch in Debian verpackt .

Francois G.
quelle
2
Daemontools ist großartig; Monit ist ein verdammter Albtraum von "Warum zum Teufel willst du nicht anfangen?!?" Frustration.
Womble
2

Überwachen oder Überwachen sind gut, um einen einzelnen Prozess am Leben zu erhalten. Da Sie darum bitten, "einen oder mehrere" Prozesse am Leben zu erhalten, möchte ich Supervisord einstecken . Es ist sicherlich übertrieben, einen einzelnen Prozess zu verwalten, aber wenn Sie mehrere Prozesse im Auge behalten müssen, kann es Ihr Ding sein.

Bittrance
quelle
2

Eine Möglichkeit besteht darin /etc/inittab, Ihr Skript zu verwenden, anstatt es einzufügen /etc/init.d/.

Sie fügen einfach einen Eintrag im folgenden Format hinzu:

<jobname>:<runlevels>:respawn:<command>

Leider bedeutet dies, dass Sie die normalen Start- / Stopp- / Neustart-Init-Befehle nicht verwenden können, aber es sollte sicherstellen, dass Ihr Skript die ganze Zeit ausgeführt wird.

Alex
quelle
2

Die verteilungsübergreifende Behandlung von Prozessneustarts erfolgt mit cron und einem einfachen Skript. Eine Beschreibung finden Sie hier. So halten Sie einen Job unter Linux am Laufen

Das Skript sieht ungefähr so ​​aus

#!/bin/bash 
# make-run.sh 
# make sure a process is always running.  
# Add the following to the crontab (i.e. crontab -e)
# */5 * * * * /home/path_to_make_run/make-run.sh

process=servermonitoringhq 
makerun="/home/path_to_the_job_you_want_running/runjob.sh"  

if pgrep $process > /dev/null         
then                 
  exit         
else         
  $makerun &         
fi 
Ian Purton
quelle