アプリケーションを実行しscreen
、screen
終了時に実行し続ける必要があるとします。次のコマンドは操作を実行しますが、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'
答え2
nohup
as catch-allコマンドを使用するnohup.out
ことは、すべての出力を抑制せずに削除することを許可しないため不可能であり、キャリッジリターンが維持されないため、nohup.out
代わりに使用screenlog.0
できません。nohup.out
nohup
shellを使用する代わりに、trap
OPのコマンドは次のとおりです。
screen -d -m -L sh -c 'trap "" HUP; DISPLAY=:0 zenity --info --text test >/dev/null 2>/dev/null &'