透明地冻结和解冻进程?

透明地冻结和解冻进程?

我正在寻找一种方法透明地冻结(暂停)某个进程,然后稍后解冻。使用 可以实现这一点SIGSTOP,但是SIGSTOP会导致父进程收到通知(通过从 返回waitpid),例如,这会导致 bash 将交互式进程置于后台(该方法的问题在 中有更详细的描述在此链接中)。

cgroup有办法实现这一点通过写入 中的文件/sys/fs/cgroup/freezer/,但这仅适用于 cgroup 级别 - 也就是说,您一次只能冻结一整组进程/线程。我想可以通过将每个进程放在自己的 cgroup 中来解决这个问题,但这似乎有点麻烦,而且可能很危险,因为systemdet al. 已经将其用于cgroups自己的目的了。

我非常接近编写一个将底层freeze_taskAPI 公开给用户空间的内核模块,但如果可能的话,我真的想避免这样做!

答案1

我可以按照以下步骤轻松冻结和解冻单个进程(xeyes):https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt

我知道这是您链接的同一篇文档,但我认为这样做没有问题。您可以轻松编写脚本/程序来自动执行所有操作并根据需要冻结单个流程。

在我的 Ubuntu 16.04 系统上,/sys/fs/cgroup/freezer 已经存在,所以我跳过了那部分。

* Examples of usage :

   # mkdir /sys/fs/cgroup/freezer    
   # mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer    
   # mkdir /sys/fs/cgroup/freezer/0   
   # echo $some_pid > /sys/fs/cgroup/freezer/0/tasks

to get status of the freezer subsystem :

   # cat /sys/fs/cgroup/freezer/0/freezer.state    THAWED

to freeze all tasks in the container :

   # echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state    
   # cat /sys/fs/cgroup/freezer/0/freezer.state    FREEZING    
   # cat /sys/fs/cgroup/freezer/0/freezer.state    FROZEN

to unfreeze all tasks in the container :

   # echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state    
   # cat /sys/fs/cgroup/freezer/0/freezer.state    THAWED

我不知道之后该如何清理。我无法删除该0目录。但我确信有办法。

这样就足够好了还是您还有其他要求?

相关内容