首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Exec.Command中断

Exec.Command中断
EN

Stack Overflow用户
提问于 2014-09-01 07:08:39
回答 1查看 813关注 0票数 0

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

例如,如果守护进程在数据库表“通知”中找到了一个新行,那么它将生成一个新的goroutine,直到运行完毕,在本例中,这意味着运行下面的命令:

代码语言:javascript
复制
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之后一直运行到完成?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 07:36:37

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

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

代码语言:javascript
复制
cmd := exec.Command("sh","-c","php /var/app/send_notification.php")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid:true}
error := cmd.Run()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25600504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档