有助于你快速使用supervisor管理进程
参考:
安装,仅列出ubuntu下的方式:
sudo apt install supervisor
修改配置:
默认情况下,supervisord提供socket供supervisorctl与之通信,但socket文件仅允许root用户读写,修改配置文件/etc/supervisor/supervisord.conf
中[unix_http_server]
部分的chmod值为0766
,重启supervisord服务:,此时普通用户执行supervisorctl status
命令不再报告权限问题。
添加应用:
在/etc/supervisor/conf.d
中添加应用配置,类似这样,minikube-dashboard.conf:
; document: http://supervisord.org/configuration.html#program-x-section-settings
[program:minikube-dashboard]
directory=/usr/local/bin
command=minikube dashboard --url
user=ian
environment=HOME="/home/ian"
stopasgroup=true
autostart=false
autorestart=false
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/home/ian/workspace/.log/minikube-dashboard.log
对部分配置项做一个说明:
- user,启动进程的用户,由于程序作为supervisord的子进程启动,如果supervisord的属主是root,虽然子进程的属主是user指定的,但是环境变量仍然继承root,这就可能导致问题,比如minikube命令需要在HOME指示的路径下设置
.minikube
目录,普通用户在root家目录下创建文件显然是权限不够的,这样就需要environment配置覆盖相关的环境变量,参考Subprocess Environment - environment,覆盖环境变量
- stopasgroup,将停止信号发送给进程组中的所有进程,以本例中的minikube-dashboard为例,执行启动命令后,将启动进程A,进程A会以子进程的方式启动进程B,如果stopasgroup为false,则执行命令
supervisorctl stop minikube-dashboard
后,只有进程A会收到中断信号,而进程B还在继续运行,本例中进程B会监听端口。这种现象通常会带来ctrl+c
与kill -2
的疑问,使用ctrl+c
在前台停止程序会将INT
信号发送到进程组中的所有进程,而使用kill -2
只会将INT
信号发送到指定pid对应的进程。在supervisor中,可以指定使用的停止信号,并且对于不同的停止信号还有一些差异性的配置 - autostart,开机启动
- autorestart,进程退出时,是否重启,可以根据退出码做差异设置,参考文档
- startsecs,进程在指定的时长内保持运行状态被认为启动成功,在此时间内进程只要进程退出就会被认为启动失败,如果是短时一次性任务,需要设置为0
- startretries,将进程置于FATAL状态之前的重试次数,每次重试的间隔是逐渐加长的,每次进程重启失败后,进程处于BACKOFF状态
- redirect_stderr,将标准错误重定向到标准输出
还有一部分值得关注的特性,全部特性和细节需要仔细翻阅官方文档:
- 如果停止了supervisord进程,它管理的program也会被停止,重启supervisord也意味着program的重启
- 有些由supervisord创建的进程会忽略supervisord发送的信号,因为它启动了专门用来处理中断的进程,例如mysqld,这种情况参考pidproxy Program
- supervisord可以监听所管理进程的监控事件,例如在占用过多内存时重启,参考Events
- 可以支持规模化扩展,参考Third Party Applications and Libraries