Process
不存在的 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?
是的,這是一個沒有領導者的會話,這對於守護程序來說很常見。
會話主要用於在終端上實現登錄會話。
當您從終端啟動守護程序時,您希望它與終端斷開連接。要使該守護程序不再將終端作為其控制終端,您需要啟動一個新會話。因此,通常守護程序會派生一個程序(這確保子程序不是程序組領導,因此父程序可以退出),並呼叫
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