web-dev-qa-db-ja.com

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

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

プログラムが自動的に再起動できるように、画面セッションを開いたままにしておきたい。それを行う方法はありますか?

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

2
Zero

問題は、プログラムがどのように奇妙にクラッシュするかということです。私の頭に浮かぶ最初の2つのこと:

  • プログラムは、最後の息を切らして、screenもクラッシュ/終了/、これを表示しない方がよいと考える奇妙な制御シーケンスを送信します。
  • プログラムは、親プロセス(screenまたはおそらく中間シェル)に信号を送信して、それらを終了します。

私が試みる次のステップ:

  1. screenはどのくらい正確に終了しますか? screenプロセス全体を強制終了しますか、それとも独自のウィンドウのみを強制終了しますか(並列実行中の画面コマンドはまだ有効ですが、画面セッションは切り離されます)?
  2. シェルからプログラムを実行する場合、トラップを使用してプログラムから来る信号をキャッチできますか?
  3. stdoutおよびstderrをファイルにリダイレクトした場合でもscreenは終了しますか(ファイルがクラッシュしなくなった場合、ファイルには何が含まれますか?興味があります)。たぶん、あなたはまだtail -fを使って実行されているプログラムを見ることができます。
  4. OK、回避は興味深い洞察を与えませんが、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)

私の場合、screen(309)ウィンドウのbash(311)から別のxterm(234)でbash(230および231)を開始し、そこからpstree | less(322および323)を実行しました。

子プロセスが終了すると、画面は終了します。これは正常な動作であり、クラッシュではありません。したがって、プログラムが画面で直接開始されてクラッシュした場合、画面も終了します。シェルでプログラムを手動で開始した場合、プログラムがクラッシュした後、そのシェルは再びプロンプトを表示するはずです。この場合、画面ウィンドウが閉じると、実際には何かがおかしいです。

ラウンドアバウトを少し知っておくと役に立ちます。プログラムを開始してリスポーンする方法。

1
ua2b