Como o Linux decide o / proc / PID / stat “nome” de um processo?

5

Atualmente, minha máquina tem 5 processos executando scripts por python , mas o Linux acha que apenas 2 deles têm o nome python (de acordo com / proc / $ pid / stat). Isto é, pgrep -af python mostra:

1784 /usr/bin/python -Es /usr/sbin/foo
2306 /usr/bin/python /usr/bin/bar
16964 /usr/bin/python /usr/bin/terminator --geometry=1400x1000
24137 python /home/me/bin/baz.py --arg 70000
25760 python2 -m guake.main

enquanto pgrep -a python mostra apenas:

24137 python /home/me/bin/baz.py --arg 70000
25760 python2 -m guake.main

Aqui estão os nomes s que o Linux deu a esses processos:

% for pid in $(pgrep -f python); do cut -d' ' -f2 /proc/$pid/stat; done
(foo)
(bar)
(/usr/bin/termin)
(python)
(python2)

Então, como o Linux decide se python ou o nome do script será o processo nome ? E por que foo e bar se tornam o nome quando o processo terminator obtém o caminho completo?

Eu assumo a maneira de invocação. Eu não sei como esses três programas foram invocados, mas aqui estão seus shebangs:

/usr/sbin/foo: #!/usr/bin/python -Es
/usr/bin/bar: #!/usr/bin/python
/usr/bin/terminator: #!/usr/bin/python

Este foi definitivamente invocado usando o shebang:

/home/me/bin/baz.py: #!/usr/bin/env python

E o Guake é lançado a partir de um script Bash assim:

exec /usr/bin/env python2 -m guake.main "$@" </dev/null >/dev/null 2>&1 &

Meu palpite ingênuo é que /usr/bin/env faz com que a palavra que o segue se torne o processo nome , mas presumo que exista mais do que apenas isso. (E mesmo se for esse o caso, como atribui esse nome ?)

    
por dg99 28.04.2016 / 18:32

1 resposta

4

Isto está ligado a um Linux:

Quando um programa inicia outro, ele deve usar o nome do arquivo executável como o parâmetro de linha de comando $ 0, mas pode optar por fazer o contrário. O campo Name de /proc/PID/status é sempre definido para o nome do executável pelo kernel (mas truncado para 15 caracteres).

O próprio aplicativo pode alterar um nome. Você pode obter o nome mais longo de /proc/PID/cmdline (leia até o primeiro byte nulo).

    
por 28.04.2016 / 19:55

Tags