繁体   English   中英

执行命令中断

[英]Exec.Command Interrupt

我正在编写一个将在ubuntu 14.04上作为守护程序运行的应用程序。 该守护程序的目的是运行一个for循环,该循环将检查各种数据库表中的数据,如果存在数据,它将产生一个goroutine来对各种数据执行各种操作。 这样做比cron允许我安排任务的时间要多。

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

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

是。 我需要执行一些php脚本。 我还没有时间去重写所有的php代码,所以我必须以某种方式进行这项工作。

我已经设法编写了守护程序,因此,如果将SIGINT发送给它,它将在大多数情况下正常关闭。 它将使所有goroutine都完成其任务,以使任何工作都不会中途停止,否则可能会导致问题。

现在的问题是,一旦将SIGINT发送到此守护程序,由exec.Command()启动的所有进程便会立即中止。

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

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

所以我的问题是:有什么方法可以允许在goroutine中启动的exec.Command()运行到守护程序接收到SIGINT的完成为止? 如果不是,是否还有另一种方法可以从go执行命令并允许其运行直到守护程序接收到SIGINT之后完成?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM