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