No Ubuntu 16.04, /sbin/init
é um link simbólico para o 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
lê o nome do comando em /proc/<pid>/stat
. Consulte 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.
Como o systemd suporta a reexecução de si mesmo como init (por exemplo, systemctl daemon-reexec
), ele tenta alterar isso para systemd
o mais rápido possível, se iniciado como /sbin/init
. De a fonte :
/* 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);
Portanto, ps -C init
não corresponderá a um systemd de PID 1. Com pgrep
, você pode usar -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
verifica /proc/<pid>/cmdline
e o systemd não tenta alterar isso. O segundo systemd
na saída ps
é o meu init de sessão do usuário.