私はプログラムを実行するための基本的なスクリプトを見ていましたがdmenu_run
、その中で私の関心を呼び起こした部分が次のとおりです。dmenu
[..other stuff..] | dmenu | sh &
だからいくつかのテストをしてみました。
前提条件情報
私はGNU / Linuxを実行しています。私のシステム
sh
に。dash
私のログインシェルは、bash
端末エミュレータです。テスト中に作成されたウィンドウのPIDに置き換えます。これを利用して得ることができます。問題が発生しない限り、ログ出力が生成されないようです。テストの対応する部分を実行するために、実際にログ出力を生成する他のプログラムに置き換えることができます。
st
xterm
$XTERMPID
xterm
xprop
xterm
テスト
シナリオ#1 - 実行xterm
(またはxterm &
)st
:
xtermがログインしていることがわかりますst
。
pstree -s $XTERMPID
出力:systemd───sddm───sddm-helper───i3───st───bash───xterm───bash
終了後st
xterm
殺された。
シナリオ#2 - 以下で実行中echo xterm | sh
(またはecho xterm | sh &
)st
:
xterm
でログを見ることができますst
。
pstree -s $XTERMPID
出力:systemd───sddm───sddm-helper───i3───st───bash───sh───xterm───bash
終了後st
:
xterm
何とか生き残った(この部分が理解できない部分だ。子どもたちはみな殺すべきではないか?)
pstree -s $XTERMPID
出力:systemd───xterm───bash
シナリオ#3 - 実行setsid -f xterm
対象st
:
あなたできないxterm
ログインを参照してくださいst
。
pstree -s $XTERMPID
出力:systemd───xterm───bash
終了後st
:
予想通り。
シナリオ#4 - 以下で実行echo "echo xterm | sh" | sh
(またはecho "echo xterm | sh &" | sh &
)st
:
あなたはできますまだxterm
ログを確認しst
ますが、xterm
もはや子孫ではありませんst
。私もこれを理解していません。
pstree -s $XTERMPID
出力:systemd───sh───xterm───bash
終了後st
:
予想通り。
質問:
st
シナリオ#2で死ぬとき、xterm
親がsh
死んだときになぜ死なないのですか?- それとも
st
カーネルが子供たちを殺すのでしょうか? - 直系の子供たちだけを殺しますか?それでは、ターミナルを閉じるとターミナルシェルで実行されているプログラムが終了するのはなぜですか?
- 子ではありませんが、シナリオ#4に
xterm
出力が表示されるのはなぜですか?どのように動作しますか?st
xterm
st
テスト#2
(echo "echo xterm | sh &" | sh &) >/dev/null 2>&1
i3blocks
スクリプトで実行
i3-msg restart
i3またはSuper + Shift + Rを再起動するまで有効です。ウィンドウは存在し続けますが、実際のプロセスは終了し、ウィンドウは黒で塗りつぶされます。
詳細については、このバグレポートをご覧ください。https://github.com/vivien/i3blocks/issues/483
setsid -f xterm
i3blocks
スクリプトで実行
仕事に問題はありません
質問:
setsid -f
デュアルパイプがsh
できない追加の作業はありますか?なぜsetsid -f
そのシーンでは動作しますが、他のシーンでは同じように見えますが、動作しませんi3blocks
かpstree
?setsid
Linux専用コマンドのようです。 POSIX準拠のシェルとcoreutilsのみを使用してどのように複製できますか?- プロセスが終了してもウィンドウが表示され続けるのはなぜですか?