verificando o id do processo de / sbin / init usando ps e pgrep

1

Os seguintes comandos não retornam nenhum resultado

ps -C init -o pid=
ps -C /sbin/init -o pid=
pgrep -x /sbin/init

em que o seguinte comando fornece a saída da seguinte forma:

$ 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

Eu gostaria de saber como obter o PID do processo init usando o método ps -C e pgrep . O que estou fazendo errado aqui?

Estou no Ubuntu 16.04.3 LTS com kernel 4.10.0-27-genérico de 32 bits

    
por Ibrahim Quraish 09.01.2018 / 04:24

2 respostas

2

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.

    
por 09.01.2018 / 08:26
1

Qualquer sistema que use systemd sem sysvcompat se comportará assim. Mesmo que / sbin / init seja um link para o systemd, o nome do comando ainda é systemd. Ao usar a opção -C de ps, isso somente procurará o systemd. Ao usar a opção -f de ps, o formato completo imprime os argumentos de comando (args) em vez dos nomes de comando (comm) na coluna CMD e, de fato, o systemd está começando a usar o arquivo /sbin/init

Experimente este comando:

ps --pid=1 -o cmd,comm

Na verdade, isso também inclui outros argumentos, se houver algum, e também implica que os argumentos no Unix, graças aos symlinks, podem levar a nomes de comandos totalmente diferentes para os quais eles apontam.

    
por 09.01.2018 / 08:13

Tags