Process

不存在的 sid/pgid 程序如何可能?

  • June 26, 2021

我在 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?

是的,這是一個沒有領導者的會話,這對於守護程序來說很常見。

會話主要用於在終端上實現登錄會話。

當您從終端啟動守護程序時,您希望它與終端斷開連接。要使該守護程序不再將終端作為其控制終端,您需要啟動一個新會話。因此,通常守護程序會派生一個程序(這確保子程序不是程序組領導,因此父程序可以退出),並呼叫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

引用自:https://unix.stackexchange.com/questions/486933