进程被 SIGKILL 后,名称周围会出现方括号 ([])

进程被 SIGKILL 后,名称周围会出现方括号 ([])

我正在执行并终止一个进程,如下所示:

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 所说。

另外,另一个答案说括号意味着内核线程不完全正确。内核线程只是没有命令行的进程的特殊情况。

相关内容