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

http://a.scwy.net/blog

我想实现以下的效果:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值