プロセス終了後に画面が終了するのを防ぐ方法

プロセス終了後に画面が終了するのを防ぐ方法

次の名前付き画面でプロセスを開始します。

screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py"

ただし、数分後にスクリプトがクラッシュして終了すると画面が終了するため、デバッグ出力は表示されません。私のスクリプトは手動で画面に接続するのに十分な長さで実行されていますが、画面はまだ自動的に終了して私を追いかけます。

実行中のプロセスが停止したときに画面が終了するのを防ぐ方法は?

答え1

出力をlessファイルにパイプしてteeファイルにパイプするlessか、sleep 99999コマンドの後に "pause"コマンドを追加できます。

screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py; sleep 9999"

とにかくからに切り替えることをお勧めしscreenますtmuxこれコマンドを実行して終了した後に維持する方法を理解するための質問です。

bash -iデフォルトではコマンドの最後に追加できます。

tmux start-server  
tmux new-session -d
tmux new-window 'ls;bash -i'

またはあなたは使用することができますこれオプションremain-on-exit

終了時の保存設定 [on |leave]

このオプションがtrueの場合、実行中のプログラムが終了したウィンドウは閉じずに開いていますが、非アクティブのままです。

答え2

デフォルトでは、screen観察したように実行中のコマンドが閉じられると終了します。単独で実行すると、screen実行されるコマンドはインタラクティブシェルであり、もちろん子孫が終了しても終了しません。

他のスクリプトで同様の結果を得るには、次のようにします。

screen -dm -S myscreen
screen -S myscreen -X stuff "export VAR=123; cd /usr/local/myproject^M"
screen -S myscreen -X stuff "./myscript.py && exit^M"

まず、ログインシェルが実行され、ログインシェルが終了するまで閉じられない新しい画面が起動します。その後、screenコマンドを使用してstuffシェルにテキストを入力できます。最初の行では、変数を定義し、ディレクトリを変更します。 2行目では、スクリプトを起動してシェルを終了します(ここでスクリプトが成功した場合はscreenセッションを閉じようとしているとします)。ただし、段落や(&&)でmyscript.py失敗した場合はexit決して発生せず、自由にスクリーンセッションに再接続して何が起こったかを確認できます。

正しく入力するには(control-v)と入力し、Enterキーと同じように入力する^M必要があります。^V^M

関連情報