以编程方式在Go或C中的控制组中启动进程

时间:2018-03-23 03:36:03

标签: go cgroups

我基本上想要cgexec的功能,但是从C或Go程序调用(有点像fork),我在现有的库中找不到任何这样的功能。

我知道我可以在Go中使用exec,但这看起来有点难看,我觉得必须有一种更惯用的方法来实现这一目标。感谢。

1 个答案:

答案 0 :(得分:0)

总结:只需运行 cgexec 即可启动该过程。请注意,cgexec **exec()** 是所需的程序。它不会fork()并在后台运行它。

TL;博士;
我在这里说的是相对无知 - 我遇到了同样的问题,并且正在研究如何去做。但是,我认为解决方案非常清楚。这是我的分析:

通过查看 cgexec.ccgexec 的源代码,您可以看到 main() 做了三件事:

  • 通常的参数解析。
  • 来查找或创建合适的 cgroup 环境。 (不,我不明白这件事的细节,但我认为这并不重要。)
  • 最后,它只是调用 execvp()。它没有fork()

记住 cgexec 是一个二进制文件。它不是图书馆。

我对此的看法是二进制文件将自身放入请求的 cgroup 环境中,然后执行请求的程序。

要完全在 golang 中执行此操作,您必须启动一个新进程,然后在其中执行二进制文件 - 这与 cgexec 所做的完全相同。通过在程序中编写 golang 代码,没有简单/直接的方法可以做到这一点。你不想想要在 golang 程序中 fork!

由于您将不得不 fork/exec something,您不妨使用 os.StartProcessos/exec.Command(. ..).Run() 运行 cgexec。它是完全安全的,并且您可以保证获得与 cgexec 相同的广为人知的语义。