我正在执行并终止一个进程,如下所示:
python some_script.py &; pid=$!; sleep 5; kill -9 $!; ps -o pid,sid,uid,state,start,command
换句话说:我在后台执行一个脚本,记录其进程ID,休眠5秒,用SIGKILL终止它,最后显示进程列表。脚本本身非常占用内存。它的源代码包含在问题的末尾。
的输出ps
是
PID SID UID S STARTED COMMAND
72014 73317 22563342 R 20:56:36 [python]
<... other processes>
接下来确认该进程已成功终止:
[1] + killed python some_script.py
我的问题:为什么 Python 进程在其名称周围显示有括号ps
?
根据这个答案,方括号表示该进程的参数不可用。通常是因为所讨论的进程是内核进程,但显然这里的情况并非如此。我能想到的一种可能性是进程的内存已被擦除,包括其堆栈,其中包含参数列表。但是,如果进程的内存被内核擦除,那么它的状态不应该是 DYING 或 ZOMBIE 而不是 RUNNING 吗?
源代码some_script.py
:
import asyncio
async def create_tasks(n_tasks):
tasks = [task() for _ in range(n_tasks)]
await asyncio.gather(*tasks)
async def task():
await asyncio.sleep(10)
if __name__ == "__main__":
asyncio.run(create_tasks(1000000))
答案1
简短的答案在ps
手册页中:
有时进程参数不可用;发生这种情况时,ps 将在括号中打印可执行文件名称。
这意味着 procps 库尝试读取/proc/<PID>/cmdline
,如果它是空的,它将打印命令名称/proc/<PID/stat
这是删除任何括号“(...)”并用括号“[...]”括起来后的第二个字段。因为ps
这就是comm
领域。
稍微改变一下你的命令行:
$ python3 some_script.py & pid=$!; sleep 5; kill -9 $!; echo CMDLINE BELOW ; cat -e /proc/${pid}/cmdline ; echo COMM BELOW ; cut -f 2 -d' ' /proc/${pid}/stat ; echo PS BELOW ; ps -o pid,sid,uid,state,start,comm,command ${pid}
[1] 62187
CMDLINE BELOW
COMM BELOW
(python3)
PS BELOW
PID SID UID S STARTED COMMAND COMMAND
62187 21814 1000 R 16:37:49 python3 [python3]
您会注意到,至于为什么参数不可用,基本上,该进程已被终止,但尚未完全消失,正如 @muru 所说。
另外,另一个答案说括号意味着内核线程不完全正确。内核线程只是没有命令行的进程的特殊情况。