如何列出可杀死的任务?

seb*_*elk 1 process kill signals

作为 ps 状态联机帮助页STATUS 值为“D”的进程表示“不间断睡眠(通常为 IO)”

另外,我读过:您应该在这里使用 TASK_INTERRUPTIBLE ,否则您的内核线程无法接收信号,并且您无法从用户空间 kill(1) 您的线程或在内核中使用 kthread_stop() 。

如果以上还不够,您可以阅读:进程状态(STAT)的 D 表示进程处于“不间断睡眠”状态。在现实世界中,这通常意味着它正在等待 I/O 并且不能/不会做任何事情——包括死亡——直到 I/O 操作完成。

假设我运行一个等待 IO 的进程:

[root@mpinode02 Distros]#  find / -mmin +10 > /dev/null &
[1] 15592
Run Code Online (Sandbox Code Playgroud)

然后我看看状态和wchan过程

[root@mpinode02 Distros]# ps -C find -ostat,comm,wchan
STAT COMMAND         WCHAN
D    find            sleep_on_buffer
Run Code Online (Sandbox Code Playgroud)

好,我们来看看这个过程是不是真的无间断:

[root@mpinode02 Distros]# kill 15592

[1]+  Terminated               time find / -mmin +10 > /dev/null
Run Code Online (Sandbox Code Playgroud)

那么,正如您所看到的,现实世界中 D 的进程被杀死了,ps 的手册页是否过时了?

事实上,我看到有一种新的状态: TASK KILLABLE但我想知道 hot 来列出它们。你知道如何列出可杀死的任务或识别它们吗?

Den*_*ker 5

欢迎来到精彩的信号和比赛条件世界。

如果你多次运行你的 ps 命令,你会发现在你运行命令时它偶尔不会处于 D 状态。虽然 find 可能大部分时间都在等待您的磁盘,但它绝对不会将所有时间都花在那里。如果不是,您的终止信号将被发送。

所以,没有办法做你想做的事。ps 可以遍历所有命令并告诉您当时哪些命令是可杀死的或不可杀死的。但是当你开始杀人时,那个列表就会改变。而且即使kill(好吧,代表kill的内核)不能立即发出信号,它也会在最早的时候这样做。所以即使是“D”状态也不意味着“根本不能被杀死”,只是“这个时钟周期不能被杀死”。