プログラムがクラッシュすると、画面セッションが終了します。

プログラムがクラッシュすると、画面セッションが終了します。

スクリーンセッションでプログラムを実行していますが、プログラムがクラッシュすると自動的に再起動しますが、プログラムがクラッシュするとスクリーンセッションは終了します。

プログラムが自動的に再起動できるように、スクリーンセッションを開いたままにしたいです。解決策は何ですか?

私はLinux Debian 7 Wheezyを実行しています。

答え1

問題は、プログラムの競合がどのように奇妙ですか?私の心に最初に浮かんだ2つのこと:

  • プログラムは最後の瞬間にいくつかの奇妙な制御シーケンスを投げて、screenユーザーを衝突/終了/考えるようにし、それを見ないことが最善だと思います。
  • プログラムは親プロセス(screenまたは中間プロセス)にシグナルを送信します。シェル)終了します。

私が試す次のステップは次のとおりです。

  1. シャットダウンはどのくらい正確ですかscreen?プロセス全体screenを終了しますか、それとも独自のウィンドウのみを終了しますか?
  2. シェルでプログラムを実行すると、次のことができます。キャプチャ信号使用されたプログラムでは
  3. screenリダイレクトしても終了しますか?標準出力そして標準エラーファイルに追加します(競合が発生しなくなった場合は、そのファイルに何が含まれているのか疑問に思います)。おそらくプログラムの実行を続けることができますtail -f
  4. いいですね。バイパスは興味深い洞察を提供しませんが、tmux代替を使用しても同じ問題がありますかscreen

編集1(広告1):競合するプログラムは画面上で直接実行できます。

screen /usr/local/bin/your/crashing/program

または、途中でシェルプロセスを使用します(たとえば、好みのシェルで画面ウィンドウを起動し、プログラムを実行します。

screen
/usr/local/bin/your/crashing/program

または、再誕生を実行するシェルスクリプトがあります。

bash -c 'while true ; do /usr/local/bin/your/crashing/program ; done'

pstreeどのプロセスが関連しているかを出力から知ることができます。

xterm(309)---bash(311)---screen(230)---screen(231)---bash(234)-+-less(323)
                                                               `-pstree(322)

私の場合は、(309)ウィンドウの(311)でscreen始まるもの(230と231)があり、別のもの(234)があり、ここで実行するもの(322と323)があります。bashxtermbashpstree | less

子プロセスが終了すると、画面も終了します。これは通常の動作であり、競合ではありません。そのため、プログラムが画面から直接起動し、競合が発生すると画面も終了します。シェルでプログラムを手動で起動すると、プログラムがクラッシュした後にシェルにプロンプ​​トを再表示する必要があります。この場合、画面ウィンドウが閉じると本当に奇妙なことが起こっています。

プログラムを起動して再起動する方法など、いくつかのことを知っておくと便利です。

関連情報