正如 ps 的联机帮助页所述STATUS 值为“D”的进程表示“不间断睡眠(通常是 IO)”
另外,我读过:您应该在此处使用 TASK_INTERRUPTIBLE,否则您的内核线程无法接收信号,并且您无法从用户空间杀死(1)您的线程或在内核中使用 kthread_stop() 。
如果以上还不够你可以阅读:D 的进程状态(STAT)表示该进程处于“不间断睡眠”状态。在现实世界中,这通常意味着它正在等待 I/O 并且不能/不会做任何事情 - 包括死亡 - 直到 I/O 操作完成。
假设我运行一个等待 IO 的进程:
[root@mpinode02 Distros]# find / -mmin +10 > /dev/null &
[1] 15592
然后我看一下状态和 wchan 进程
[root@mpinode02 Distros]# ps -C find -ostat,comm,wchan
STAT COMMAND WCHAN
D find sleep_on_buffer
好吧,让我们看看这个过程是否真的是不可中断的:
[root@mpinode02 Distros]# kill 15592
[1]+ Terminated time find / -mmin +10 > /dev/null
那么,正如您所看到的,现实世界中带有 D 的进程被杀死了,ps 的手册页是否已过时?
事实上,我看到有一种新的状态: 任务可杀但我想知道如何列出它们。您知道如何列出或识别可杀死的任务吗?
答案1
欢迎来到信号和竞赛条件的奇妙世界。
如果您多次运行 ps 命令,您会发现在运行该命令时它有时不处于 D 状态。虽然 find 可能会花费大部分时间等待您的磁盘,但它绝对不会将所有时间都花在那里。如果不是,你的杀戮信号将会被传递。
所以,有决不做你想做的事。 ps 可以迭代所有命令并告诉您当时哪些命令是可杀死的或不可杀死的。但当你开始杀人时,这个列表就会改变。即使kill(好吧,代表kill的内核)无法立即发出信号,它也会尽早发出信号。因此,即使是“D”状态也不意味着“根本不能被杀死”,只是“不能在这个时钟周期被杀死”。