나는 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
자체적으로 두 번 포크하여 데몬화하고 시작되는 세션에 대해 자체적으로 분리합니다.
아이는 죽고 손자는 서버를 운영한다. 이는 서버에 상위가 없음을 의미합니다.
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
첫 번째 창에서 프로세스를 실행하기 위해 프로세스를 분기합니다.