注:本文使用版本: 4.0.4 (Mac环境下)html
在项目,常常须要将一个进程设置为守护进程(常驻进程),比较简单的作法是 nohup + &
,稍微高级一点的作法就是使用Supervisor了。web
Supervisor包含两部分:supervisord 和 supervisorctl。shell
启动Supervisor的时候,本质上是启动一个supervisord
进程,这个进程将所管理的进程做为本身的子进程来启动,并且能够在所管理的进程出现崩溃时自动重启。bash
supervisorctl
则是一个命令行管理工具,能够执行 stop、start、restart 等命令,实现对子进程的管理。socket
# Ubuntu
apt install supervisor
# Pip
pip install supervisor
# Mac
brew install supervisor
复制代码
# Mac (可经过 brew info supervisor 查看本身的启动方式)
supervisord -c /usr/local/etc/supervisord.ini
# Ubuntu 宿主机
systemctl start supervisor
# Ubuntu Docker容器
sudo /etc/init.d/supervisor start
复制代码
supervisorctl 有两种方式与supervisord进行通讯:本地socket链接
和 http链接
。工具
supervisorctl 默认使用的是 http链接,因此当你未开启http配置且执行supervisorctl
命令时,会出现以下错误:加密
$ supervisorctl
http://localhost:9001 refused connection
supervisor>
复制代码
开启http配置(注意http通讯并无加密)spa
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
复制代码
从新启动supervisord进程命令行
supervisord -c /usr/local/etc/supervisord.inirest
若是不想开启http配置,则每次都须要指定配置文件
supervisorctl -c /usr/local/etc/supervisord.ini
$ supervisord -v
4.0.4
1.对于Mac系统,主配置文件位于 /usr/local/etc/supervisord.ini
2.对于Ubuntu系统,主配置文件位于 /etc/supervisor/supervisord.conf
3.对于较早的版本,可能须要手动生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
子进程配置文件路径可在主配置文件中找到,个人路径以下:
[include]
files = /usr/local/etc/supervisor.d/*.ini
复制代码
为了更好地说明,咱们先编写一个Shell脚本,定时打印当前日期
#/bin/bash
while true; do
echo now: `date "+%Y-%m-%d %H:%M:%S"`
sleep 2
done
复制代码
配置文件以下:
; 注释使用的是分号
[program:printime]; webhook是进程名/服务名
; 启动命令
command=bash /home/xxx/print_time.sh
; 自动重启
autostart=true
autorestart=true
user=xxx
umask=022
; 日志文件
stdout_logfile=/home/xxx/print_time.log
; 重定向错误日志到stdout
redirect_stderr=true
;日志级别
loglevel=info
复制代码
更新配置并启动服务
$ supervisorctl update
printime: added process group
$ supervisorctl
printime RUNNING pid 88295, uptime 0:00:06
复制代码
restart:重启进程,并不会从新读取配置文件,因此服务实际未使用新配置
reread:只会更新配置文件,不会重启进程,因此服务实际未使用新配置
update:更新配置文件,并重启配置文件有更新的进程,至关于 reread + restart,因此服务会使用新配置
reload:重启supervisord,至关于更新全部服务的配置文件,并重启全部服务(谨慎使用)
参考:
www.onurguzel.com/supervisord…
supervisord.org/runnin g.html?highlight=reread
当使用supervisor启动某个进程时,你会发现该进程没法读取系统环境变量,由于 supervisor 启动的时候是使用 /etc/init.d 启动,因此系统环境变量根本没有加载起来。
解决办法是在配置文件指定环境变量,例如:
[program:xxx]
;通常指定环境变量的方式: export SSH_KEY=xxx
;使用 supervisor 指定环境变量的方式
environment=SSH_KEY=xxx
复制代码