Linux 如何决定进程的 /proc/PID/stat “名称”?

dg9*_*g99 6 linux proc

目前我的机器有 5 个进程通过 运行脚本python,但 Linux 认为其中只有 2 个有这个名字 python(根据 /proc/$pid/stat)。也就是说,pgrep -af python显示:

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
Run Code Online (Sandbox Code Playgroud)

pgrep -a python仅显示:

24137 python /home/me/bin/baz.py --arg 70000
25760 python2 -m guake.main
Run Code Online (Sandbox Code Playgroud)

下面是s表示Linux已经给这些过程:

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

那么 Linux 如何决定是python脚本名称还是脚本名称将是进程名称?当进程获得完整路径时,为什么 dofoobar成为名称terminator

我假设调用方式很重要。我不知道这三个程序是如何调用的,但这是它们的shebang:

/usr/sbin/foo: #!/usr/bin/python -Es
/usr/bin/bar: #!/usr/bin/python
/usr/bin/terminator: #!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

这个肯定是使用shebang调用的:

/home/me/bin/baz.py: #!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

Guake 是从 Bash 脚本启动的,如下所示:

exec /usr/bin/env python2 -m guake.main "$@" </dev/null >/dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

我天真地猜测是这/usr/bin/env会导致它后面的单词成为 process name,但我认为它不仅仅如此。(即使是这种情况,它如何分配该名称?)

小智 3

这取决于Linux:

当一个程序启动另一个程序时,它应该使用可执行文件的名称作为命令行参数 $0,但它也可以选择不这样做。字段始终由内核设置为可执行文件的名称(但被截断为 15 个字符)Name/proc/PID/status

应用程序本身可以更改名称。您可以从中获取更长的名称/proc/PID/cmdline(读取到第一个空字节)。