目前我的机器有 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
或脚本名称将是进程姓名?以及为什么foo
会bar
成为姓名当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
(读取到第一个空字节)。