psとpgrepを使用して/ sbin / initのプロセスIDを確認してください。

psとpgrepを使用して/ sbin / initのプロセスIDを確認してください。

次のコマンドは結果を返しません。

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-reexecinitで始まるとできるだけ早く変更しようとします。 ~から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 initPID 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はユーザーセッションの初期化です。

おすすめ記事