zshでtmuxの子プロセスと兄弟プロセスを実行する

zshでtmuxの子プロセスと兄弟プロセスを実行する

私は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()ある分岐プロセスを作成することです。このプロセスを作成したプロセスの兄弟プロセスがどのように発生したのかわかりません。zshtmux: clienttmux: 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最初のウィンドウでプロセスを実行するためにプロセスを分岐します。

関連情報