3 Stimmen

Selbststartprogramm bei Segfault unter Linux

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)?

11voto

Anycorn Punkte 48423

Am einfachsten ist

while [ 1 ]; do ./program && break; done

Im Grunde führen Sie das Programm aus, bis es 0 zurückgibt, dann brechen Sie ab.

7voto

llasram Punkte 4235

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.

7voto

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.

3voto

Roman Nikitchenko Punkte 12374

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

1voto

Shaggy Frog Punkte 27326

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.

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