존재하지 않는 sid/pgid 프로세스가 어떻게 가능합니까?

존재하지 않는 sid/pgid 프로세스가 어떻게 가능합니까?

Ubuntu 17.04의 프로세스를 나열하고 다음 프로세스를 확인했습니다.

root@user-virtual-machine:~# ps  xao pid=,ppid=,pgid=,sid=
1603      1   1601   1601

그러나 프로세스 1601은 존재하지 않습니다.

root@user-virtual-machine:~# ls /proc/1601
ls: cannot access '/proc/1601': No such file or directory

보시다시피 /proc/1603/status는 여전히 1601을 참조합니다.

root@user-virtual-machine:~# cat /proc/1603/status
Name:   VGAuthService
Umask:  0000
State:  S (sleeping)
Tgid:   1603
Ngid:   0
Pid:    1603
PPid:   1
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 64
Groups:  
NStgid: 1603
NSpid:  1603
NSpgid: 1601
NSsid:  1601

내가 호스트 머신(컨테이너 내부가 아님)에 있다는 점을 언급할 가치가 있습니다.

이것이 어떻게 가능한지? 존재하지 않는 프로세스에 대해 setid/setpgid를 설정하는 방법은 무엇입니까?

답변1

예, 이것은 데몬에게 흔히 발생하는 리더 없는 세션입니다.

세션은 주로 터미널 로그인 세션을 구현하는 데 사용됩니다.

터미널에서 데몬을 시작할 때 터미널과의 연결을 끊기를 원합니다. 데몬 프로세스에서 더 이상 터미널을 제어 터미널로 사용하지 않으려면 새 세션을 시작해야 합니다. 따라서 데몬은 일반적으로 프로세스를 분기하고(이는 하위 프로세스가 프로세스 그룹 리더가 아니므로 상위 프로세스가 종료될 수 있음을 보장함) setsid()하위 프로세스를 호출합니다.

이 하위 항목은 새 세션의 리더가 되므로 터미널에서 제어하는 ​​세션이 아닙니다. 그러나 프로세스가 O_NOCTTY 플래그를 전달하지 않고 다른 터미널 장치를 열면 해당 터미널이 세션의 제어 터미널이 되며 이는 데몬에 대해 원하는 것이 아닙니다. 이런 일이 발생하지 않도록 하려면 다시 포크하는 것이 좋습니다. 그러면 하위 프로세스가 더 이상 세션 리더가 아니며 터미널 장치를 열어도 아무런 해를 끼치지 않습니다.

상위 프로세스는 머물거나 종료할 이유가 없으므로 세션에는 더 이상 리더가 없습니다.

따라서 데몬이 리더 없이 세션에서 실행되는 것이 일반적입니다.

여기서 리더가 없는 세션의 프로세스를 검색하면 많은 데몬이 표시됩니다.

$ ps -je | grep -wf <(comm -23 <(ps -eo sid= | sort -u) <(ps -eo pid= | sort -u) | awk '$1{print $1}')
 1722  1714  1714 ?        00:00:01 atopacctd
 2540  2178  2178 ?        00:00:00 ddclient - slee
 2985  2984  2984 ?        00:00:00 dnsmasq
 2987  2984  2984 ?        00:00:00 dnsmasq
 8428  8427  8427 ?        00:00:00 gnome-keyring-d
 8726  8725  8725 ?        00:01:17 pulseaudio
11456 11455 11455 ?        00:00:00 gnome-keyring-d
11649 11648 11648 ?        00:00:00 pulseaudio

관련 정보