go - 执行命令中断

标签 go

我正在编写一个将在 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/

相关文章:

php - 如何处理视频和图像上传到存储服务器?

go - 如何编写漂亮干净的 Go 包?

opengl - 渲染不同于单 channel 渲染

Golang 计算结构结构中的字段数

go - 使用 Go 删除​​链接列表中的项目

go - resp.Body 的内容存储在哪里?

go - 将恢复传递给上层 goroutine golang

Go 语言中的 PHP file_get_contents

GO - net/http - 如何获取请求字符串和方法

go - bufio.NewReader 总是创建一个新行 :/