golang exec 在正在运行的二进制/进程上执行命令

Posted

技术标签:

【中文标题】golang exec 在正在运行的二进制/进程上执行命令【英文标题】:golang exec a command on a running binary / process 【发布时间】:2014-09-17 17:11:43 【问题描述】:

如果您查看 nginx,它会调用“nginx reload”来重新加载自身。有没有办法从命令行向正在运行的进程发送信号?即使主进程启动子进程,我如何向主进程发送命令以通知其子进程?

例如:

myapp start -debug // starts a server
myapp reload -gracefull // stops the app gracefully

现在我需要发送 os 信号来通知我的服务器执行正常关机

kill -QUIT pid
kill -USR2 pid

我希望我的问题足够清楚 谢谢

【问题讨论】:

【参考方案1】:

接收信号

看看os/signal 包。

包信号实现对传入信号的访问。

文档中甚至还有一个example:

// Set up channel on which to send signal notifications.
// We must use a buffered channel or risk missing the signal
// if we're not ready to receive when the signal is sent.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)

// Block until a signal is received.
s := <-c
fmt.Println("Got signal:", s)

发送信号

要了解如何发送信号,请查看signal_test.go,它使用syscall。例如:

// Send this process a SIGHUP
t.Logf("sighup...")
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
waitSig(t, c, syscall.SIGHUP)

【讨论】:

我知道这一点,我在我的程序中使用它。但我希望它从命令行向自己的进程发送信号 如果我的程序已经在运行并且我想从它自己的 cli 发送一个信号?应用程序-退出。它是一个不同的 pid 对吗? @AnthonyDeMeulemeester 我想您可以将 pid 存储在本地文件或环境变量中。 我用它的 cli 调用同一个二进制文件,但它们不共享 os.Env @AnthonyDeMeulemeester 他们共享同一个文件系统吗?当二进制开始将 PID 号写入 PID 文件时,当您要重新加载读取 PID 文件以获取 PID 号时。【参考方案2】:

我发现在 go i 中我们可以将环境传递给 syscall.Exec

err := syscall.Exec(argv0. os.Args. os.Environ())

只需将当前环境复制到子进程。

【讨论】:

以上是关于golang exec 在正在运行的二进制/进程上执行命令的主要内容,如果未能解决你的问题,请参考以下文章

golang 进程创建,fork,以及热重启(无缝升级)

golang 使用Golang访问Exec'd进程的StdIn

Golang编译的二进制文件在alpine中无法运行

Golang编译的二进制文件在alpine中无法运行

Golang编译的二进制文件在alpine中无法运行

在 Golang 中运行 exec.Command 时如何调试“退出状态 1”错误