
Ich führe ein Programm in einer Screen-Sitzung aus. Wenn das Programm abstürzt, startet es sich neu, aber wenn das Programm abstürzt, wird die Screen-Sitzung beendet.
Ich möchte, dass die Bildschirmsitzung geöffnet bleibt, damit das Programm sich selbst neu starten kann. Gibt es eine Möglichkeit, das zu tun?
Ich verwende Linux Debian 7 Wheezy
Antwort1
Die Frage ist, wie bizarr es ist, dass das Programm abstürzt. Zuerst fallen mir zwei Dinge ein:
- Das Programm sendet mit seinem letzten Atemzug einige seltsame Steuersequenzen aus, die
screen
auch zum Absturz/Beenden führen können/man denkt, es sei besser, Sie das nicht sehen zu lassen. - Das Programm sendet Signale an seine übergeordneten Prozesse (
screen
oder möglicherweise an einen ZwischenprozessHülse), das sie beendet.
Als nächstes würde ich versuchen:
- Wie genau wird
screen
beendet? Beendet es den gesamtenscreen
Prozess oder nur das eigene Fenster (bleiben parallel laufende Bildschirmbefehle noch aktiv, wird die Bildschirmsitzung getrennt)? - Wenn Sie das Programm von einer Shell aus ausführen, können SieSignale fangenaus dem Programm mitfangen?
- Wird es immer noch beendet
screen
, wenn Sie umleitenstdoutUndstderrin eine Datei (was enthält die Datei, wenn sie nicht mehr abstürzt – das würde mich interessieren). Vielleicht kann man das laufende Programm noch mit beobachtentail -f
. - OK, die Umgehung wird keine interessanten Erkenntnisse liefern, aber besteht das gleiche Problem, wenn man
tmux
anstelle von verwendetscreen
?
Edit 1 (ad 1): Das abstürzende Programm kann entweder direkt vom Bildschirm aus gestartet werden, zB
screen /usr/local/bin/your/crashing/program
oder mit einem Shell-Prozess dazwischen (zB starten Sie Ihr Bildschirmfenster mit Ihrer bevorzugten Shell, dann führen Sie das Programm aus wie
screen
/usr/local/bin/your/crashing/program
oder ein Shell-Skript haben, das den Respawn mit etwas wie durchführt
bash -c 'while true ; do /usr/local/bin/your/crashing/program ; done'
pstree
Um welche Prozesse es sich handelt, können Sie an der Ausgabe erkennen :
xterm(309)---bash(311)---screen(230)---screen(231)---bash(234)-+-less(323)
`-pstree(322)
screen
In meinem Fall habe ich (230 und 231) von einem bash
(311) in einem xterm
(309) Fenster mit einem weiteren (234) gestartet , von dem aus ich (322 und 323) bash
ausgeführt habe .pstree | less
Screen wird beendet, wenn der untergeordnete Prozess beendet wird. Dies ist ein normales Verhalten und kein Absturz. Wenn Ihr Programm also direkt in Screen gestartet wird und abstürzt, wird auch Screen beendet. Wenn Sie Ihr Programm manuell in einer Shell gestartet haben, sollte diese Shell nach dem Absturz des Programms erneut ihre Eingabeaufforderung anzeigen. Wenn sich das Screen-Fenster in diesem Fall schließt, stimmt tatsächlich etwas nicht.
Es wäre hilfreich, ein wenig über die Zusammenhänge zu wissen, z. B. wie Sie Ihr Programm starten und neu starten.