Linux常见守护进程启用方式-Supervisor管理GoServer/开机自启
前面说到,自己做了一个log的server服务,用go来写的。并一个最常规的 nohup /server & 后台运行。这种方式有个问题在重启或者程序异常退出的时候就丢失了服务,就需要一个守护进程服务来管理相应的程序,
守护进程
Linux常见的守护进程方式有
1:nohup /comand &
2:tmux
3:systemd
4:三方工具 supervisor
个人理解
nohup:一次性或者简单的 需要后台执行的可以用nohup 来执行,
tmux: 用的比较少 理解了下 虽然实现了这个功能,但是他的目标是为了登录多个session 有点牵强。
systemd:系统自带的一般管理系统服务,可以用注册一个守护服务(supervisor)来守护自定义的进程(webserver)
supervisor:一套完善的监控进程状态,异常退出重启,可配置。当然还有类似的有一些核心功能跟supervisor相似但是更轻量级。
案例实践
systemd 注册supervisor ,supervisor 管理go服务
安装supervisor
详细的参看:http://supervisord.org/index.html ,我的博客一般不是手把手安装,主要步骤记录下 最好的手册是官方手册。
#pip install supervisor #echo_supervisord_conf > /etc/supervisor/supervisord.conf //创建默认的配置文件 记住对应的路径 #mkdir /etc/supervisor/app // 创建一个目录用来存放单个的服务,当然也可以写到主文件里面 ,但是还是分开清楚
编辑supervisor.con 最后 开启加载文件
//变更前 ;[include] ;files = relative/directory/*.ini //变更后 [include] files = /etc/supervisor/app/*.conf
增加守护的配置
在app目录下面新建server.conf
配置可以参考:https://www.jianshu.com/p/0b9054b33db3
#项目名 [program:blog] #脚本目录 directory=/opt/bin #脚本执行命令 command=/usr/bin/python /opt/bin/test.py #supervisor启动的时候是否随着同时启动,默认True autostart=true #当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的 autorestart=false #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1 startsecs=1 #脚本运行的用户身份 user = test #日志输出 stderr_logfile=/tmp/blog_stderr.log stdout_logfile=/tmp/blog_stdout.log #把stderr重定向到stdout,默认 false redirect_stderr = true #stdout日志文件大小,默认 50MB stdout_logfile_maxbytes = 20M #stdout日志文件备份数 stdout_logfile_backups = 20
这样就可以直接运行了
/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
相应的其他命令
supervisorctl 参看文档
但是这样每次重启机器,就需要执行一次,还是把这个服务注册到systemd里面
systemd
参考:https://www.jianshu.com/p/03619bf7d7f5
在/usr/lib/systemd/system 下面创建文件
vim supervisord.service
#supervisord.service [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/local/bin/supervisorctl shutdown ExecReload=/usr/local/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
启用服务
systemctl enable supervisord
实际测试 删除对应的goserver,能够基本做到秒起 无缝。
现在不太在状态,先这样吧