我正在寻找一种方法来透明地冻结(暂停)一个进程,然后再解冻它。这在 中是可能的SIGSTOP
,但SIGSTOP
会导致父级被通知(通过从 中返回waitpid
),这例如导致 bash 将交互式进程置于后台(该方法的问题在此链接中有更详细的描述)。
cgroup
子系统有办法通过写入 中的文件来完成此操作/sys/fs/cgroup/freezer/
,但这仅适用于 cgroup 级别 - 也就是说,您一次只能冻结整个进程/线程组。我想可以通过安排将每个进程放在自己的 cgroup 中来解决这个问题,但这似乎有点麻烦,而且可能很危险,因为systemd
et al. 已经cgroups
用于他们自己的目的。
我非常接近于编写一个将底层freeze_task
API 暴露给用户空间的内核模块,但如果可能的话,我真的很想避免这样做!
我能够使用以下说明轻松地冻结和解冻单个进程(xeyes):https ://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt
我知道这是您链接到的同一个文档,但我认为这样做没有问题。您可以轻松编写脚本/程序来为您自动执行这一切,并根据需要冻结各个进程。
在我的 Ubuntu 16.04 系统上,/sys/fs/cgroup/freezer 已经存在,所以我跳过了那部分。
我不知道如何清理之后。我无法删除
0
目录。但我确信有办法。这足够好还是您还需要其他东西?