Bildschirmsitzung wird beendet, wenn das Programm abstürzt

Bildschirmsitzung wird beendet, wenn das Programm abstürzt

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 screenauch 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 ( screenoder möglicherweise an einen ZwischenprozessHülse), das sie beendet.

Als nächstes würde ich versuchen:

  1. Wie genau wird screenbeendet? Beendet es den gesamten screenProzess oder nur das eigene Fenster (bleiben parallel laufende Bildschirmbefehle noch aktiv, wird die Bildschirmsitzung getrennt)?
  2. Wenn Sie das Programm von einer Shell aus ausführen, können SieSignale fangenaus dem Programm mitfangen?
  3. 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 beobachten tail -f.
  4. OK, die Umgehung wird keine interessanten Erkenntnisse liefern, aber besteht das gleiche Problem, wenn man tmuxanstelle von verwendet screen?

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'

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

screenIn 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) bashausgefü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.

verwandte Informationen