【问题标题】:How can I put process into "uninterruptible sleep"?如何使进程进入“不间断睡眠”?
【发布时间】:2012-08-31 12:22:21
【问题描述】:

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

【问题讨论】:

    标签: unix process signals coredump


    【解决方案1】:

    最合适的方法是使用 freezer 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。

    【讨论】:

    • 这对我有用,谢谢。出于某种原因,ps aux 的输出仅在我向进程发送 SIGTERM 后反映状态D
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 但是在转储核心进程的过程中是免疫SIGKILL的。
        • 因此...在内核中被阻塞。
        • 如果你用 STAT==D 阻止了它们,至少在我们的系统 (centos6.4) 上你不能杀死它们,你需要解决根本问题。
        猜你喜欢
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多