Unix 我如何将流程放入“中”;“不间断睡眠”;?

Unix 我如何将流程放入“中”;“不间断睡眠”;?,unix,process,signals,coredump,Unix,Process,Signals,Coredump,我正在测试一些监控进程的功能,我需要模拟具有确定“延迟”的长内核转储(例如,我需要使一个进程“转储内核”30秒)。我注意到转储内核的进程处于不间断睡眠状态,所以不能用SIGKILL终止,但当我尝试使用接收coredump的管道命令来模拟这种行为时,我可以轻松终止这样的进程。那么,有没有办法让进程进入不间断睡眠(这种状态处于ps)并忽略SIGKILL?没有办法阻止SIGKILL。这就是目的。摆脱流程的大锤方法。SIGKILL可以阻止的唯一方法是进程是否锁定在内核中。要将进程置于可中断睡眠模式,您必

我正在测试一些监控进程的功能,我需要模拟具有确定“延迟”的长内核转储(例如,我需要使一个进程“转储内核”30秒)。我注意到转储内核的进程处于不间断睡眠状态,所以不能用SIGKILL终止,但当我尝试使用接收coredump的管道命令来模拟这种行为时,我可以轻松终止这样的进程。那么,有没有办法让进程进入不间断睡眠(这种状态处于ps)并忽略SIGKILL?

没有办法阻止SIGKILL。这就是目的。摆脱流程的大锤方法。SIGKILL可以阻止的唯一方法是进程是否锁定在内核中。

要将进程置于可中断睡眠模式,您必须进入内核代码。
使用
wake\u up\u interruptable
和旋转锁的功能,您将能够实现此状态

一种可靠(如果复杂)的方法是硬挂载NFS目录,然后关闭NFS服务器。

最合适的方法是使用冷冻库cgroup。在cgroup状态冻结的情况下,它将进程置于不间断睡眠状态

# mkdir /sys/fs/cgroup/freezer
# mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer
# mkdir /sys/fs/cgroup/freezer/frozen
# echo FROZEN > /sys/fs/cgroup/freezer/frozen/freezer.state
# echo `pidof you_process` > /sys/fs/cgroup/freezer/frozen/tasks

要再次进入可中断睡眠,只需将cgroup状态更改为解冻。

但在转储过程中,核心进程不受SIGKILL的影响。因此…在内核中被阻止。如果您使用STAT==D阻止它们,至少在我们的系统(centos6.4)上,您无法杀死它们,您需要解决根本问题。这对我很有效,谢谢。由于某种原因,
ps aux
的输出仅反映了我向进程发送SIGTERM后的状态
D