为了账号安全,请及时绑定邮箱和手机立即绑定

退出后任务从cgroup中移除

退出后任务从cgroup中移除

Go
临摹微笑 2023-07-17 17:53:12
这是我的测试代码。我想将当前PID写入文件tasks:package subsystemsimport (  "io/ioutil"  "os"  "path"  "strconv"  "testing")func TestSubsystems(t *testing.T) {  p := "/sys/fs/cgroup/memory/test1"  f := "tasks"  err := os.MkdirAll(p, 0644)  if err != nil {    t.Log(err.Error())  }  pid := os.Getpid()  if err := ioutil.WriteFile(path.Join(p, f), []byte(strconv.Itoa(pid)), 0644); err != nil {    t.Failed()  }}但是当程序以代码 0 退出时,我看不到任何内容tasks:root@ubuntu:/sys/fs/cgroup/memory/test1# cat tasksroot@ubuntu:/sys/fs/cgroup/memory/test1# cat tasksroot@ubuntu:/sys/fs/cgroup/memory/test1# 如何解决这个问题呢?
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你所描述的根本不是问题——这是一个正确的行为:

  • 您创建一个空的 cgroup;

  • 您向其添加任务;

  • 任务在cgroup中运行一段时间;

  • 任务退出;

  • 由于上一项的原因,该任务被从 cgroup 中删除;

  • cgroup又空了;

  • 您观察 cgroup 成员列表,但什么也没看到。

为什么这是正确的行为?嗯,最简单的答案是没有理由将不存在的 PID 保留在 cgroup 成员列表中。另一方面,这样做的原因有很多。

PID 重用是首先想到的原因之一:如果某个 PID 在任务死亡或正常关闭后没有从 cgroup 中删除,则稍后将重用该 PID 的任何其他任务(假设该 cgroup 仍然存在) alive) 将成为该组的成员,这显然不是期望的行为,特别是当我们谈论容器时(例如,如果我们谈论 cgroup,这种行为可能是获得特权的原因)devices

正如我之前在评论中提到的,我在文档中找不到对此行为的明确描述 - 可能是因为它感觉太明显了,但源代码是不言自明的:系统调用在exit(2)幕后执行, cgroup_exit()此函数将任务移出其 cgroups。


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信