官网:http://supervisord.org/running.html
简介:是一个用python写的进程管理工具。
生产环境或者测试环境,如果担心服务以外挂掉,可以考虑使用supervisor管理进程。
安装:可以使用pip,但是由于是mac系统,更倾向于用brew:
brew install supervisor
/usr/local/etc/supervisord.ini也是supervisord的默认配置文件。
我们先看下配置文件的最后两句:
[include]
files = /usr/local/etc/supervisor.d/*.ini
其他的配置文件可以放在这个位置,会被自动加载。
新写一个简单的forloop的shell:
#!/bin/bash
for ((i=0;i<100;i++))
do
echo $i
sleep 1s
done
为这个进程写一个supervisor的配置文件my.ini,并放在之前的目录下:
[program:myProgram]
directory = /Users/miracle/Project/shell/ ; 程序的启动目录
command = /Users/miracle/Project/shell/forloop.sh ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /Users/miracle/supervisor/log.log
第一行,是该程序的唯一标识,后面supervisor使用该标识管理进程。
使用如下命令启动supervisord守护进程:
supervisorctl -c /usr/local/etc/supervisord.ini
ps -ef |grep super
501 8249 1 0 2:50下午 ?? 0:00.89 /usr/local/Cellar/supervisor/4.2.0/libexec/bin/python3.8 /usr/local/bin/supervisord -c /usr/local/etc/supervisord.ini
可以看到已经成功启动。
启动forloop进程:
supervisorctl -c /usr/local/etc/supervisord.ini start myProgram
通过status命令查看状态:
supervisorctl -c /usr/local/etc/supervisord.ini status myProgram
myProgram RUNNING pid 10256, uptime 0:00:31
可以看到,之前的forloop进程已经成功启动。
再次确认下:
ps -ef |grep forloop
501 10402 8249 0 3:33下午 ?? 0:00.01 /bin/bash /Users/miracle/Project/shell/forloop.sh
现在我们测试kill调该进程:
kill -9 10402
再ps看下:
ps -ef |grep forloop
501 10484 8249 0 3:33下午 ?? 0:00.01 /bin/bash /Users/miracle/Project/shell/forloop.sh
可以看到进程没有挂,pid变了。
另外,我们看下supervisord的进程日志,tail -f /usr/local/var/log/supervisord.log:
2020-08-09 15:31:15,084 INFO stopped: myProgram (terminated by SIGTERM)
2020-08-09 15:31:19,744 INFO spawned: 'myProgram' with pid 10256
2020-08-09 15:31:24,760 INFO success: myProgram entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2020-08-09 15:33:00,144 INFO exited: myProgram (exit status 0; expected)
2020-08-09 15:33:01,147 INFO spawned: 'myProgram' with pid 10402
2020-08-09 15:33:06,172 INFO success: myProgram entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2020-08-09 15:33:53,354 INFO exited: myProgram (terminated by SIGKILL; not expected)
2020-08-09 15:33:54,357 INFO spawned: 'myProgram' with pid 10484
2020-08-09 15:33:59,382 INFO success: myProgram entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
可以看到,我们kill后,进程被supervisord重新唤起。
停止进程:
supervisorctl -c /usr/local/etc/supervisord.ini stop myProgram
对于stop、status以及start命令,如果想直接运行必须放在supervisorctl命令后,当然可以先运行命令:
supervisorctl -c /usr/local/etc/supervisord.ini
进入交互式命令行,再输入对应stop、status以及start命令等。