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はユーザーセッションの初期化です。

答え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のパラメータがシンボリックリンクのためにまったく異なるコマンド名を指す可能性があることを意味します。

関連情報