前提条件情報

前提条件情報

私はプログラムを実行するための基本的なスクリプトを見ていましたがdmenu_run、その中で私の関心を呼び起こした部分が次のとおりです。dmenu

[..other stuff..] | dmenu | sh &

だからいくつかのテストをしてみました。

前提条件情報

私はGNU / Linuxを実行しています。私のシステム
shに。dash私のログインシェルは、bash端末エミュレータです。テスト中に作成されたウィンドウのPIDに置き換えます。これを利用して得ることができます。問題が発生しない限り、ログ出力が生成されないようです。テストの対応する部分を実行するために、実際にログ出力を生成する他のプログラムに置き換えることができます。
stxterm
$XTERMPIDxtermxprop
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出力が表示されるのはなぜですか?どのように動作しますか?stxtermst

テスト#2

(echo "echo xterm | sh &" | sh &) >/dev/null 2>&1i3blocksスクリプトで実行

i3-msg restarti3またはSuper + Shift + Rを再起動するまで有効です。ウィンドウは存在し続けますが、実際のプロセスは終了し、ウィンドウは黒で塗りつぶされます。
詳細については、このバグレポートをご覧ください。https://github.com/vivien/i3blocks/issues/483

setsid -f xtermi3blocksスクリプトで実行

仕事に問題はありません

質問:

  • setsid -fデュアルパイプがshできない追加の作業はありますか?なぜsetsid -fそのシーンでは動作しますが、他のシーンでは同じように見えますが、動作しませんi3blockspstree
  • setsidLinux専用コマンドのようです。 POSIX準拠のシェルとcoreutilsのみを使用してどのように複製できますか?
  • プロセスが終了してもウィンドウが表示され続けるのはなぜですか?

ベストアンサー1

おすすめ記事