在Ubuntu中作为守护进程启动Go程序的正确方法是什么?然后我会用Monit监控它.我应该做的事情如下:
go run myapp.go &
Run Code Online (Sandbox Code Playgroud)
是否有特定于Go的东西我应该考虑到?
问题:
我正在 linux 上用 golang 编写程序,该程序需要执行长时间运行的进程,以便:
我正在以 root 权限运行我的程序。
尝试的解决方案:
func Run(pathToBin string, args []string, uid uint32, stdLogFile *os.File) (int, error) {
cmd := exec.Command(pathToBin, args...)
cmd.SysProcAttr = &syscall.SysProcAttr{
Credential: &syscall.Credential{
Uid: uid,
},
}
cmd.Stdout = stdLogFile
if err := cmd.Start(); err != nil {
return -1, err
}
go func() {
cmd.Wait() //Wait is necessary so cmd doesn't become a zombie
}()
return cmd.Process.Pid, nil
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎满足了我几乎所有的要求,除了当我将 SIGTERM/SIGKILL 发送到我的程序时,底层进程崩溃了。事实上,我希望我的后台进程尽可能独立:它与我的程序有不同的父进程号、组进程号等。我想将它作为守护进程运行。
stackoverflow 上的其他解决方案建议cmd.Process.Release() …