我想实现以下的效果:
当nginx已运行后,你可以运行nginx -reload xxxx来重新载入配置文件。实现不中断程序,而向程序传达指令。
现在考虑的实现方法:
运行的程序开放一个tcp端口,监听指令。
当程序运行之前,先查看是否存在此端口,并进行通信。
若能正常通信交互,表示已运行,只需要发送命令行指令给已执行的程序即可。若不能通信,则运行程序。
当然,还考虑通过共享内存的方式,或许更为直接一些。
https://studygolang.com/articles/10203
https://studygolang.com/articles/743
或许使用信号?
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
//创建监听退出chan
for {
c := make(chan os.Signal) //监听指定信号 ctrl+c kill
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)
s := <-c
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
fmt.Println("exit", s)
os.Exit(1)
case syscall.SIGUSR1: //kill -10 pid 用户保留信号,随便你做啥了
fmt.Println("usr1", s)
case syscall.SIGUSR2: //kill -12 pid 用户保留信号,随便你做啥了
fmt.Println("usr2", s)
default:
fmt.Println("other", s)
}
}
}
不过这只能使用两个信号。当然要捕获其它信号也可以:象30.31.17.16,但不知道是否会出点灵异事件。
研究(百度)发现,syscall.Signal(35)到syscall.Signal(64),即35到64号都是可以使用的。这下够用了。
https://blog.csdn.net/renlonggg/article/details/78294293 这里说到了。
不过下个问题是:golang如何模拟发送系统信号,总不能shell kill吧。研究一下....
https://blog.csdn.net/zhuxinquan61/article/details/81410958
文章介绍了关于kill进程,syscall.Kill(-Pid, syscall.SIGKILL) 这样就把Pid杀了(其实是发某一个信号),这里的kill其实只是send的意思。
“蛋是”如何查找进程?继续.....
ps: 刚写完就有访问,是因为很多人搜索nginx吗?