删除/杀死一个不会死的进程

Dea*_*nen 4 linux process kill pkill

我正在使用 Linux Ubuntu 20.04。

我有一个 PID 为 21 的进程:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
21  root      20   0       0      0      0 S   0.0   0.0   0:00.01 kdevtmpfs
Run Code Online (Sandbox Code Playgroud)

运行任何一个后

  • sudo pkill -9 21
  • sudo kill 21

该过程在top或的输出中仍然可见ps aux

我怎样才能杀死它?

Ned*_*d64 12

正如 AB 指出的那样,这是 Linux 内核的一个线程(用于一个功能),因此不能被杀死。此外,杀死/删除它也没有任何好处。

ps使用以下参数调用时可以更清楚地看到:

# ps auxfww
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    Jun07   0:00 [kthreadd]
(...)
root        21  0.0  0.0      0     0 ?        S    Jun07   0:00  \_ [kdevtmpfs]
(...)
Run Code Online (Sandbox Code Playgroud)

在那里你可以看到它是内核的后代。该RSS=0VSZ=0也的指标。

如果上述标志不适用于您的 版本ps,请尝试ps -ejfH在层次结构中查看每个进程以及作业详细信息。

  • @terdon 内核线程可以选择在接收到信号后做任何他们喜欢做的事情(例如,通过查看fatal_signal_pending()),但它们中的大多数根本不处理它。所以它不能被杀死的原因只是因为没有人认为对于这个特定线程实现它有任何意义(实际上,对于大多数线程来说,响应信号没有多大用处)。通常:作为返回用户空间的一部分,信号被隐式检查,内核线程不返回用户空间,因此任何检查都必须是显式的。 (6认同)
  • @terdon 不用担心:-) 举一个反例来说明“通常我们不在内核中进行显式信号处理”语句(尽管这个有一个用户空间组件):例如,我们作为 [cgroup v2 的一部分来做内存分配器节流](https://lore.kernel.org/patchwork/patch/1103564/)(请参阅`schedule_timeout_killable`,如果我们知道线程已发送致命信号,它允许更快地退出节流)。:-) (2认同)