次のコマンドは結果を返しません。
ps -C init -o pid=
ps -C /sbin/init -o pid=
pgrep -x /sbin/init
次のコマンドは、次の出力を提供します。
$ ps -ealf | grep init
4 S root 1 0 0 80 0 - 6266 - 08:35 ? 00:00:03 /sbin/init auto noprompt
$ pidof init
1
initプロセスを使ってPIDを取得する方法を知りたいです。ポリスチレン-Cそしてパッケージ方法。私がここで何を間違っているのか?
カーネル4.10.0-27-generic 32ビットでUbuntu 16.04.3 LTSを使用しています。
ベストアンサー1
Ubuntu 16.04では、/sbin/init
以下はsystemdへのシンボリックリンクです。
$ readlink /sbin/init
/lib/systemd/systemd
$ sudo readlink /proc/1/exe
/lib/systemd/systemd
$ sudo xargs -0a /proc/1/cmdline
/sbin/init splash
ps -C
読み取っているコマンドの名前です/proc/<pid>/stat
。バラよりman 5 proc
:
/proc/[pid]/stat
Status information about the process. This is used by ps(1).
It is defined in the kernel source file fs/proc/array.c.
...
(2) comm %s
The filename of the executable, in parentheses.
This is visible whether or not the executable is
swapped out.
systemdはinit(たとえば)で独自の再実行をサポートしているため、systemctl daemon-reexec
initで始まるとできるだけ早く変更しようとします。 ~からsystemd
/sbin/init
源泉:
/* If we get started via the /sbin/init symlink then we are called 'init'. After a subsequent reexecution we
* are then called 'systemd'. That is confusing, hence let's call us systemd right-away. */
program_invocation_short_name = systemd;
(void) prctl(PR_SET_NAME, systemd);
したがって、ps -C init
PID 1を使用したsystemdは一致しません。ここpgrep
に-f
。
$ ps -C systemd
PID TTY TIME CMD
1 ? 00:00:01 systemd
1261 ? 00:00:00 systemd
$ pgrep -f /sbin/init
1
pgrep -f
確認し/proc/<pid>/cmdline
、systemdはこれを変更しようとしません。出力systemd
の2番目の項目ps
はユーザーセッションの初期化です。