【问题标题】:Programatically starting a process in a control group in Go or C以编程方式在 Go 或 C 中的控制组中启动进程
【发布时间】:2018-03-23 03:36:02
【问题描述】:

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

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

【问题讨论】:

    标签: go cgroups


    【解决方案1】:

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

    TL;DR;
    我是从相对无知的角度说的-我遇到了同样的问题,并且正在研究如何解决。但是,我认为解决方案非常明确。这是我的分析:

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

    • 常用参数解析。
    • 是否用于查找或创建适当的 cgroup 环境。 (不,我不明白其中的细节,但我认为这并不重要。)
    • 最后,它只是调用 execvp()不是 fork()

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

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

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

    既然你将不得不 fork/exec something,你也可以只使用 os.StartProcessos/exec.Command(. ..).Run() 运行 cgexec。它是完全安全的,并且保证您获得与 cgexec 相同的众所周知的语义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多