私はUbuntu 22.04.1
(この質問にのみ関連しているWSL 2
という事実にもかかわらず)を使用していますUnix
tmux
セッションで実行するときにzsh
プロセスツリー(少し要約しました)が次から始まるのはなぜですか?
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
└─zsh───pstree
到着
init(Ubuntu)─┬─SessionLeader───Relay(9)─┬─ssh-agent
├─tmux: server───zsh───pstree
└─zsh───tmux: client
ここでpstree
コマンドはプロセスツリーを知らせるので、上に表示されます。
tmux
で実行するときにzsh
発生することは、zsh
実行が(つまり上記の)子プロセスでfork()
ある分岐プロセスを作成することです。このプロセスを作成したプロセスの兄弟プロセスがどのように発生したのかわかりません。zsh
tmux: client
tmux: server
答え1
サーバーの場合は、それ自体tmux
を2回フォークしてデーモン化し、開始されたセッションに対してそれ自体を分離します。
子供は死に、孫はサーバーを作動させる。これは、サーバーに親がないことを意味します。
init
親を持たないプロセスは通常、ID 1のプロセスによって採用されます。 Linuxでは、特定のプロセスを親プロセスとして指定できます。子供用収穫機使用PR_SET_CHILD_SUBREAPER
prctl()
その子孫のためにこの役割を引き受けます。
ここで観察している内容はWSLと似ています。このRelay(9)
プロセスはおそらく子供用収穫機そしてtmux
サーバーデーモンを採用しました。
誰かがわかる子供用収穫機あなたの先祖の中にはこのような人がいました。
((zmodload zsh/system; sleep 0.2; echo $sysparams[ppid])&) | cat
Relay(9)
プロセスのpidを返したいです。
tmux
以下で実行して、ここの手順に従うことができます。
strace -fo log -e clone,exit_group,prctl tmux
その後、ファイルの内容を確認してくださいlog
。次の内容が表示されます。
3908 execve("/usr/bin/tmux", ["tmux"], 0x7fffd0c3e990 /* 50 vars */) = 0
3908 prctl(PR_SET_NAME, "tmux: client") = 0
両親はお客様です。
3908 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f54afe20a10) = 3909
3909 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f54afe20a10) = 3910
サーバーを2回フォークします。
3909 exit_group(0) = ?
子供の解雇。
3910 prctl(PR_SET_NAME, "tmux: server") = 0
孫(上の両親を失って養子になった人) 子供用収穫機)サーバーを実行します。
[...]
3910 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f54afe20a10) = 3911
3911 execve("/bin/zsh", ["-zsh"], 0x55bee5bdd170 /* 54 vars */) = 0
サーバーは、$SHELL
最初のウィンドウでプロセスを実行するためにプロセスを分岐します。