如何将流程置于“不间断睡眠”中?

时间:2012-09-06 16:11:48

标签: unix process signals coredump

我正在测试某些功能来监控进程,我需要模拟具有确定“延迟”的长核心转储(例如,我需要将进程“转储核心”30秒)。我注意到转储核心的进程处于不间断睡眠状态,因此无法使用SIGKILL杀死它,但是当我尝试使用接收coredump的管道命令来模拟此行为时,我可以轻易地杀死此类进程。那么是否有一些方法可以使进程进入不间断睡眠状态(在 ps 中具有此类状态)并使其忽略SIGKILL?

4 个答案:

答案 0 :(得分:7)

最恰当的方法是使用冰箱cgroup。在FROZEN 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状态更改为THAWED。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

无法阻止SIGKILL。这就是目的。摆脱过程的大锤子方法。 SIGKILL可以阻止的唯一方法是在内核中锁定进程。