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