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자체적으로 두 번 포크하여 데몬화하고 시작되는 세션에 대해 자체적으로 분리합니다.

아이는 죽고 손자는 서버를 운영한다. 이는 서버에 상위가 없음을 의미합니다.

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

서버를 두 번 포크합니다.

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첫 번째 창에서 프로세스를 실행하기 위해 프로세스를 분기합니다.

관련 정보