目前我的机器有 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
脚本名称还是脚本名称将是进程名称?当进程获得完整路径时,为什么 dofoo
和bar
成为名称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
(读取到第一个空字节)。