Was wäre unter Linux der beste Weg für ein Programm, sich bei einem Absturz selbst neu zu starten, indem es die Ausnahme in einem Crashhandler abfängt (zum Beispiel bei einem Segfault)?
Antworten
Zu viele Anzeigen?Sie können eine Schleife haben, in der Sie im Wesentlichen fork()
Die eigentliche Arbeit wird im untergeordneten Programm ausgeführt, während das untergeordnete Programm lediglich wartet und seinen Ausgangsstatus im übergeordneten Programm überprüft. Sie können auch ein System verwenden, das Programme auf ähnliche Weise überwacht und neu startet, z. B. daemontools, runit usw.
SIGSEGV
gefangen werden können (siehe man 3 signal
o man 2 sigaction
), und das Programm kann eine der exec
Familie von Funktionen auf sich selbst, um neu zu starten. Ähnliches gilt für die meisten Laufzeitabstürze ( SIGFPE
, SIGILL
, SIGBUS
, SIGSYS
, ...).
Ich würde mir das aber vorher gut überlegen. Es ist eine eher ungewöhnliche Strategie für ein Unix-Programm, und Sie könnten Ihre Benutzer überraschen (nicht unbedingt auf angenehme Weise).
Achten Sie in jedem Fall darauf, dass no automatischer Neustart bei SIGTERM
wenn es Ressourcen gibt, die Sie aufräumen wollen, bevor sie sterben, sonst werden verärgerte Benutzer die SIGKILL
und du wirst ein Chaos hinterlassen.
Als Ergänzung zu dem, was hier vorgeschlagen wurde:
Eine andere Möglichkeit ist es, so zu verfahren, wie es für den getty-Daemon gemacht wird. Bitte lesen Sie /etc/inittab und die entsprechende inittab(5)-Manualseite. Es scheint so, als wäre es ein systemweites Mittel ;-).
Es könnte wie das folgende Dateifragment aussehen. Der offensichtliche Vorteil dieses Mittels ist, dass es sich um einen Standard handelt, der es erlaubt, den Daemon über die Runlevel zu steuern.
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
Prozesse können sich nicht selbst neu starten, aber Sie können ein Dienstprogramm wie crontab(1)
um ein Skript zu planen, das in regelmäßigen Abständen überprüft, ob der Prozess noch aktiv ist.
- See previous answers
- Weitere Antworten anzeigen