
最近写了一个服务, 全天监控某些网站的数据. 因为写的粗糙, 异常发生(websocket 断掉)之后没有做重试(恢复). 或者说代码写的时候没有考虑那么多, 拿起来键盘就是一把梭.
解决的办法就是外面套一个壳子, 让程序在子进程里跑, 父进程监控子进程的状态, 死了就再开一个子进程.
觉得这个轮子蛮好用的, 可以随时 kill,重启的服务都可以用.
不像 supervisor 那么重, 也不用 systemd 的配置, 直接传一个函数, 就可以 wrapper 住, 分享给需要的人, 其他语言也可以照着写. python 有一个单文件的 web server 实现代码改变自动重启也是用这种方法.
git: https://github.com/Petelin/restart
package main import ( "os" "time" "fmt" "github.com/petelin/restart" ) func main() { fmt.Println("i am ", os.Getpid()) go func() { <-time.After(time.Second) os.Exit(0) }() restart.Run(func() { fmt.Println("my father is ", os.Getppid()) time.Sleep(time.Second * 2) }) } 1 hansonwang99 2018-08-10 15:46:00 +08:00 厉害了 |
2 GjriFeu 2018-08-10 21:34:16 +08:00 这个挂了咋办。。再套一个。。 |
3 julyclyde 2018-08-10 22:15:26 +08:00 那你这个程序挂了咋办呢? 别人用 init/systemd 是因为如果 init/systemd 挂了内核会自动重启;你这程序有这个特殊地位吗? |
4 azzwacb9001 2018-08-27 10:23:59 +08:00 感谢分享,请问下具体应该怎么用?把 restart.Run()的参数换成要保护的进程? |
6 petelin OP @azzwacb9001 参数是一个 function 里面是你的逻辑 |