SCREENでアプリケーションがすぐに実行されないのはなぜですか?

SCREENでアプリケーションがすぐに実行されないのはなぜですか?

アプリケーションを実行しscreenscreen終了時に実行し続ける必要があるとします。次のコマンドは操作を実行しますが、sleep 1「」が追加された場合にのみ適用されます。 「」なしではなぜ動作しませんかsleep 1

screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'

ベストアンサー1

これはタイミングの問題のようです。nohupこれは、親の1人が信号を送信する前に信号を無効にするのに十分な時間がないためです。コマンドstrace -o /tmp/s -ffの前に追加してから、表示さscreenれる/tmp/s.*ログファイルの1つでこれを確認できます。

...
access("/bin/nohup", X_OK)              = 0
stat("/bin/nohup", {st_mode=S_IFREG|0755, st_size=36696, ...}) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
+++ killed by SIGHUP +++

起動プロセスを簡素化できます。これは私にとって効果的です。必要ありません&

DISPLAY=:0 screen -d -m -L nohup zenity --info --text test 

別の解決策は、親シェルがジョブ制御を使用するように要求するようです。これは、SIGHUP をバックグラウンドでディセーブルまたはnohupシャットダウンする前にサブプロセスが続行するのを待つようです。元のコマンドsh -cmの代わりに使用すると、よりうまく機能します。sh -cたとえば、これは私にとって効果的でした。

screen -d -m -L sh -cm 'nohup zenity --info --text test >&/dev/null & echo'

-cバージョンではそうではありません。ジョブ制御を使用している場合は、SIGHUPでバックグラウンドジョブを保護するコマンドがbashありますdisownが、そうでなくてもプロセスの実行をnohup終了せずに機能するため、必要ありません。screen

screen -d -m -L sh -cm 'zenity --info --text test >&/dev/null </dev/null & echo'

おすすめ記事