【发布时间】:2018-03-23 03:36:02
【问题描述】:
我基本上想要 cgexec 的功能,但从 C 或 Go 程序(有点像 fork)调用,我在现有库中找不到任何此类功能。
我知道我可以在 Go 中使用 exec,但这看起来有点难看,我觉得必须有一种更惯用的方法来实现这一点。谢谢。
【问题讨论】:
我基本上想要 cgexec 的功能,但从 C 或 Go 程序(有点像 fork)调用,我在现有库中找不到任何此类功能。
我知道我可以在 Go 中使用 exec,但这看起来有点难看,我觉得必须有一种更惯用的方法来实现这一点。谢谢。
【问题讨论】:
总结:只需运行 cgexec 即可启动该过程。请注意,cgexec **exec()** 是所需的程序。它不会 fork() 并在后台运行它。
TL;DR;
我是从相对无知的角度说的-我遇到了同样的问题,并且正在研究如何解决。但是,我认为解决方案非常明确。这是我的分析:
通过查看 cgexec.c 中 cgexec 的源代码,您可以看到 main() 做了三件事:
请记住,cgexec 是一个二进制文件。它不是图书馆。
我对此的看法是二进制文件将自身置于请求的 cgroup 环境中,然后执行请求的程序。
要纯粹在 golang 中执行此操作,您必须启动一个新进程,然后在其中执行二进制文件 - 这与 cgexec 所做的完全相同。通过在程序中编写 golang 代码,没有简单/直接的方法来做到这一点。你不想在 golang 程序中分叉!
既然你将不得不 fork/exec something,你也可以只使用 os.StartProcess 或 os/exec.Command(. ..).Run() 运行 cgexec。它是完全安全的,并且保证您获得与 cgexec 相同的众所周知的语义。
【讨论】: