最近写了一个服务, 全天监控某些网站的数据. 因为写的粗糙, 异常发生(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 里面是你的逻辑
|