获取有关 cgroup 进程更改的通知?

Posted

技术标签:

【中文标题】获取有关 cgroup 进程更改的通知?【英文标题】:Get notification on cgroup process change? 【发布时间】:2016-03-08 21:23:20 【问题描述】:

基本上,通常用于通知文件系统更改的 inotify 在 cgroup 虚拟文件系统中不起作用。

本质上,当 cgroup 中的进程死亡或分叉时,我想要一种方法来获取类似于 inotify 的通知。我尝试将 inotify 附加到 cgroup 文件系统内的 tasks 虚拟文件,但是当进程自行分叉时,它什么也不做,只有当使用空间工具实际手动写入它以影响 cgroup 时。

【问题讨论】:

【参考方案1】:

inotify 不适用于此类虚拟文件系统,无论是cgroupproc 还是sys

注意:我也试过这个,在某些情况下它会很方便,但是不行。 :-)

这是因为文件和目录实际上并不存在(例如它们占用 0 磁盘空间),它们是由内核在您访问时动态为您生成的他们。

因此,替代方法是定期在繁忙的循环中主动访问文件和目录,这非常丑陋,以至于在大多数情况下它不是真正的替代方法。

这就是为什么tophtop 等程序会消耗如此多的 CPU 的原因。他们实际上并积极地浏览proc 虚拟文件系统,而不是inotifyselect 或类似的东西。

编辑:

但有些事情可以帮助你:

1/ 对于最近的内核(重新设计了 cgroup):

看看:

https://www.kernel.org/doc/Documentation/cgroup-v2.txt

我引用:

2-3。 [未]填充通知

每个非根 cgroup 都有一个“cgroup.events”文件,其中包含 “填充”字段指示 cgroup 的子层次结构是否具有 其中的实时进程。如果没有实时进程,则其值为 0 cgroup 及其后代;否则,1. poll 和 [id]notify 当值改变时触发事件。 [...]

1/ 对于旧内核:

您可能想看看notify_on_releaserelease_agent。看看:

https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt

notify_on_release 标志:退出时运行释放代理? release_agent:用于发布通知的路径(此文件仅存在于*** cgroup 中)

以及“1.4 notify_on_release 做什么?”部分和“1.5 clone_children 是做什么的?”

【讨论】:

注意:如果您使用 eventfd 注册了适当的文件描述符,也可能会收到通知。在 cgroups2 中,您还可以使用 inotify(参见 archive.fosdem.org/2017/schedule/event/cgroupv2/attachments/…)

以上是关于获取有关 cgroup 进程更改的通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取有关数据库列更改的通知

在 Linux 上获取有关网络接口更改的通知

获取有关 FaxOut RingCentral API 的传真状态更改的通知

如何从 Scintilla 获取有关插入符号移动的通知

通知 ember-data 有关服务器更改

当另一个进程对文本文件进行更改时,C# 会收到通知