O que significa 'init [2]' na coluna COMMAND do ps?

5

Lendo O que significam os parênteses em torno dos processos? Eu entendo que o nome do executável é impresso.

Página man ps do Linux:

Sometimes the process args will be unavailable; when this happens, ps will instead print the executable name in brackets.

No entanto, com ps -Awwo pid,comm,args , obtenho:

  PID COMMAND         COMMAND
    1 init            init [2]

O que isso significa? O "nome do executável" deveria ser init ou [2] ?

Suponho que o executável seja, é claro, init - o que é [2] ? Por que é impresso?

(Além disso, eu realmente não entendo porque não é possível mostrar o caminho completo se ele souber o nome do executável).

    
por n611x007 24.11.2013 / 23:00

1 resposta

7

A coluna comm e a primeira palavra da coluna args na ps output mostram o nome do programa executável se todos os envolvidos seguirem a convenção padrão. No entanto, é possível ter discrepâncias por vários motivos.

Quando um programa é iniciado, o nome do comando, conforme mostrado na coluna args , é escolhido pelo programa pai que executa o programa e é passado como um argumento ( argv[0] ). Por convenção, o pai escolhe o nome base do executável (ou seja, o caminho para o executável sem a parte do diretório), mas isso não é imposto. Quando o programa estiver em execução, ele poderá substituir essa sequência.

O Init (pelo menos o Linux SysVinit tradicional) sobrescreve seu argv[0] para indicar o runlevel atual.

No Linux, a coluna comm é inicialmente preenchida pelo kernel para os primeiros 16 caracteres do nome base do executável. O processo pode alterar o conteúdo com a prctl chamada do sistema.

Se o executável for renomeado ou excluído, nem a coluna comm nem a coluna args refletirão isso.

ps não exibe o caminho para o executável, isso não está na descrição do trabalho. lsof pode te dizer com lsof -a -p 1 -d txt .

No Linux, você pode ver essas informações em arquivos em /proc/PID/ :

  • O nome do processo ( comm field) em /proc/1/stat (segundo campo entre parênteses) e /proc/1/status ( Name field).
  • O caminho para o executável via /proc/1/exe .
  • Os argumentos (começando com argv[0] ) em /proc/1/cmdline (os argumentos são separados por bytes nulos).
por 24.11.2013 / 23:13