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

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

目前我的机器有 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

pgrep -a python仅显示:

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

这里有姓名Linux 为这些进程提供了:

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

那么Linux如何决定是否python或脚本名称将是进程姓名?以及为什么foobar成为姓名terminator进程获得完整路径时?

我认为调用方式很重要。我不知道这三个程序是如何调用的,但以下是它们的功能:

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

这肯定是使用 shebang 调用的:

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

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

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

我天真的猜测是这/usr/bin/env会导致它后面的单词成为过程姓名,但我认为还有更多的事情要做。 (而且即使是这样,如何它分配那个吗姓名?)

答案1

这取决于Linux:

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

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

相关内容