Supervisor( http://supervisord.org )是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个用户关注的进程。用Supervisor管理的进程,当进程意外被杀死,可以配置supervisort监听到进程死后,重新拉起。很方便地做到进程自动恢复,不再需要自己写shell脚本来控制。
OS: Ubuntu 16.04
Kernel: 4.15.0
supervisor: 3.3.5 (默认版本)
sudo apt-get install supervisorl
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
特别说明:由于用户权限问题,建议以root用户的权限执行这些程序。
>>>which supervisord
/home/bear/anaconda2/bin/supervisord
>>>which supervisorctl
/home/bear/anaconda2/bin/supervisorctl
>>>which echo_supervisord_conf
/home/bear/anaconda2/bin/echo_supervisord_conf
supervisor默认配置文件位置
>>>/etc/superisor/ tree
.
├── conf.d
│ └── redis.conf
└── supervisord.conf
可以看到supervisor主要包含两个配置部分,主程序配置文件和被管理程序配置文件集合。
如果没有制定的配置文件,可以手动通过echo_supervisord_conf程序手动生成。
sudo echo_supervisord_conf > /etc/supervisor/supervisord.conf
supervisor.conf默认文件内容
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
这里要注意 unix_http_server 跟 supervisorctl中的 sock 文件目录要一致 。从配置文件的include说明可以看出,程序启动以后会加载conf.d目录下所有的conf文件。
可以使用以下命令启动、更新配置、更新进程、查看状态
#启动superisor主程序
>>> supervisord
# 读取有更新(增加)的配置文件,不会启动新添加的程序
>>> supervisorctl reread
# 重启配置文件修改过的程序
>>> supervisorctl update
# 查看程序状态
>>> supervisorctl status
# 启动程序 App_name
>>> supervisorctl start App_name
# 关闭程序 App_name
>>> supervisorctl stop App_name
# 重启程序 App_name
>>> supervisorctl restart App_name
启动主程序以后可以简单查看启动情况
>>>ps aux | grep suprvisor
root 4166 0.0 0.2 61780 19912 ? Ss 3月09 0:05 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
bear 11796 0.0 0.0 15988 1012 pts/19 S+ 14:32 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn supervisor
在conf.d目录下新建文件redis.conf
[program:redis-server]
#启动命令
command=redis-server
#自动启动
autostart=true
#自动重启
autorestart=true
查看目前os的端口占用情况
sudo netstat -tunlp
[sudo] bear 的密码:
激活Internet连接 (仅服务器)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN 4166/python
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5169/redis-server 1
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1010/nginx -g daemo
tcp 0 0 127.0.0.1:5939 0.0.0.0:* LISTEN 1047/teamviewerd
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1323/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 14578/cupsd
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 29176/python
tcp 0 0 127.0.0.1:16835 0.0.0.0:* LISTEN 3638/code
tcp6 0 0 :::6379 :::* LISTEN 23215/redis-server
tcp6 0 0 :::80 :::* LISTEN 1010/nginx -g daemo
tcp6 0 0 ::1:631 :::* LISTEN 14578/cupsd
udp 0 0 0.0.0.0:38718 0.0.0.0:* 1323/dnsmasq
udp 0 0 127.0.1.1:53 0.0.0.0:* 1323/dnsmasq
udp 0 0 0.0.0.0:68 0.0.0.0:* 18269/dhclient
udp 0 0 0.0.0.0:631 0.0.0.0:* 14579/cups-browsed
udp 0 0 0.0.0.0:54016 0.0.0.0:* 788/avahi-daemon: r
udp 0 0 0.0.0.0:5353 0.0.0.0:* 2198/chrome
udp 0 0 0.0.0.0:5353 0.0.0.0:* 788/avahi-daemon: r
udp6 0 0 :::36993 :::* 788/avahi-daemon: r
udp6 0 0 :::5353 :::* 2198/chrome
udp6 0 0 :::5353 :::* 788/avahi-daemon: r
杀掉占用端口的进程
sudo kill -9 23215
将redis进程托管给Supervisor
supervisorctl reread
supervisorctl update
除了 supervisorctl 之外,还可以配置 supervisrod 启动 web 管理界面,这个 web 后台使用 Basic Auth 的方式进行身份认证。
编辑配置文件/etc/supervisor/supervisord.conf,添加inet_http_server节点
[inet_http_server]
port=127.0.0.1:9001
username=******
password=******
杀掉占用9001端口的进程以后重启supervisor程序。直接访问http://localhost:9001