這是我的測試代碼。我想將當前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。
- 1 回答
- 0 關注
- 180 瀏覽
添加回答
舉報
0/150
提交
取消