Exec.Command中断

时间:2014-09-01 07:08:39

标签: go

我正在编写一个将在ubuntu 14.04上作为守护进程运行的应用程序。这个守护进程的目的是运行一个for循环,它将检查各种数据库表中的数据,如果存在数据,它将生成一个goroutine来对各种数据采取各种操作。这样做是为了让我更频繁地完成任务,而不是让cron允许我安排任务。

一个示例是,如果守护程序在数据库表“notifications”中找到一个新行,它将生成一个新的goroutine,它将一直运行直到完成,在这种情况下意味着运行以下命令:

err := exec.Command("sh","-c","php /var/app/send_notification.php").Run()

是。我需要从go执行一些PHP脚本。我没有时间分配重写所有的PHP代码,所以我必须以某种方式完成这项工作。

我已经成功编写了守护进程,因此如果发送SIGINT,它将执行大部分正常关闭。它将让所有goroutine完成他们的任务,以便在中途停止工作,最终可能导致问题。

现在的问题是,只要将SIGINT发送到此守护程序,exec.Command()启动的任何和所有进程都会立即中止。

http://rcrowley.org/articles/golang-graceful-stop.html

上面的链接是我用作此守护程序的模板。

所以我的问题是:有没有办法允许在goroutine中启动的exec.Command()在守护进程收到SIGINT时运行直到完成?如果没有,是否还有另一种方法可以执行命令,并允许它在守护进程收到SIGINT后运行直到完成?

1 个答案:

答案 0 :(得分:2)

新创建的进程将与您的守护程序位于同一进程组中。 这意味着默认情况下,发送到您的守护程序的信号将广播到您创建的进程。

您可以使用Cmd类型的SysProcAttr属性在命令之前强制新创建的进程位于其自己的进程组中。

cmd := exec.Command("sh","-c","php /var/app/send_notification.php")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid:true}
error := cmd.Run()