我正在编写一个将在 ubuntu 14.04 上作为守护进程运行的应用程序。这个守护进程的目的是运行一个 for 循环,该循环将检查各种数据库表中的数据,如果存在数据,它将生成一个 goroutine 以对各种数据执行各种操作。这样做是为了让我比 cron 允许我安排任务更频繁地执行任务。
一个例子是,如果守护进程在数据库表“notifications”中发现了一个新行,它会生成一个新的 goroutine,该 goroutine 会一直运行直到完成,在这种情况下,这意味着运行以下命令:
err := exec.Command("sh","-c","php /var/app/send_notification.php").Run()
是的。我需要从 go 执行一些 php 脚本。我还没有时间用 go 重写所有 php 代码,所以我必须以某种方式完成这项工作。
我已经设法编写了守护进程,因此如果向它发送 SIGINT,它会进行大部分正常的关闭。它会让所有的 goroutines 完成他们的任务,这样就不会中途停止工作,这可能最终会导致问题。
现在的问题是,一旦 SIGINT 被发送到这个守护进程,由 exec.Command() 启动的所有进程都会立即中止。
http://rcrowley.org/articles/golang-graceful-stop.html
上面的链接是我用作此守护程序模板的链接。
所以我的问题是:有什么方法可以让在 goroutine 中启动的 exec.Command() 运行直到守护进程收到 SIGINT 时完成?如果没有,是否有另一种方法可以从 go 执行命令并允许它运行直到守护程序收到 SIGINT 后完成?
最佳答案
新创建的进程将与您的守护进程位于同一个进程组中。 这意味着默认情况下,发送到您的守护程序的信号将广播到您创建的进程。
您可以使用 SysProcAttr
强制您新创建的进程在他自己的进程组中,就在命令之前Cmd
类型的属性。
cmd := exec.Command("sh","-c","php /var/app/send_notification.php")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid:true}
error := cmd.Run()
关于go - 执行命令中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25600504/