【问题标题】:How to properly start a process that will daemonize using Go?如何正确启动将使用 Go 进行守护进程的进程?
【发布时间】:2014-04-09 23:57:29
【问题描述】:

我编写的 Go 程序将运行另一个将守护进程的 Go 程序。

我想知道第一个程序在其子进程进入守护进程之前必须等待多长时间。

cmd := exec.Command(path1)
cmd.Start()
    // exit here

cmd := exec.Command(path1)
cmd.Run()
    // exit here

cmd := exec.Command(path1)
cmd.Start()
time.Sleep(5 * time.Second)
    // exit here

如果我使用cmd.Run() 启动的守护程序中的什么命令/动作将在第一个程序中结束“等待”。

【问题讨论】:

    标签: linux go


    【解决方案1】:

    守护进程是just a fancy way of forking the process。这意味着您启动的进程将在启动守护进程后立即退出。因此你想使用Run,它将等待启动的进程返回(成功的fork)。

    Process A:
    |
    |`-- run(B)
    |    Process B:
    |    |
    |    |`-- daemonize(C)
    |    |
    |     `-- exit
    |
     `-- daemonizing done
    

    如果要等待守护进程的某个状态,最可靠的方法是由守护进程发出信号。例如使用套接字、文件或共享内存。

    【讨论】:

    • 在我的情况下,exec 在常见的守护进程示例中是否替换了fork?或者启动的程序 B 必须仍然 forksetsid 或者只有 setsid 就足够了。据我了解exec.Command(x).Run()fork exec,第二个fork 不是必需的。
    • setsid 的调用必须将新进程与之前的process group 纠缠在一起。但是,如果您在理解守护进程或分叉时遇到问题,我建议您提出一个新问题,而不是在这里讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多