gpt4 book ai didi

go - 执行命令中断

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:24 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com