次のコマンドは結果を返しません。
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
はユーザーセッションの初期化です。
答え2
sysvcompatなしでsystemdを使用するすべてのシステムは次のとおりです。 / sbin / initはsystemdへのリンクですが、コマンド名はまだsystemdです。 psの-Cオプションを使用すると、systemdのみが検索されます。 psの-fオプションを使用すると、フォーマット全体がCMD列にコマンド名(comm)の代わりにコマンド引数(args)を印刷し、systemdが実際にそのファイルを使用し始めることを意味します。/sbin/init
次のコマンドを試してください。
ps --pid=1 -o cmd,comm
実際には、これには他のパラメータ(存在する場合)も含まれます。これは、Unixのパラメータがシンボリックリンクのためにまったく異なるコマンド名を指す可能性があることを意味します。