我正在寻找一种方法透明地冻结(暂停)某个进程,然后稍后解冻。使用 可以实现这一点SIGSTOP
,但是SIGSTOP
会导致父进程收到通知(通过从 返回waitpid
),例如,这会导致 bash 将交互式进程置于后台(该方法的问题在 中有更详细的描述在此链接中)。
这cgroup
有办法实现这一点通过写入 中的文件/sys/fs/cgroup/freezer/
,但这仅适用于 cgroup 级别 - 也就是说,您一次只能冻结一整组进程/线程。我想可以通过将每个进程放在自己的 cgroup 中来解决这个问题,但这似乎有点麻烦,而且可能很危险,因为systemd
et al. 已经将其用于cgroups
自己的目的了。
我非常接近编写一个将底层freeze_task
API 公开给用户空间的内核模块,但如果可能的话,我真的想避免这样做!
答案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
目录。但我确信有办法。
这样就足够好了还是您还有其他要求?