存在しない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

おすすめ記事