实现类似nginx的命令行参数传入

我想实现以下的效果:

当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吗?