使用ssh远程维护VPS时候,要在后台挂起一个程序。挂起程序很简单,在command后加上&
符号就可以,但是当断开ssh时候,挂起的程序也随之killed, 很是恼火。在使用nohup 的时候意外发现了supervisor, supervisor使用python开发,通过配置文件来配置需要启动监管的程序,作为supervisord
的子进程。执行程序supervisord即‘守护进程’(Daemon)[在希腊神话中是守护神的意思!类似中国的护法?daemon这个词和恶魔(demon)只差一个字母,且发音完全一样!多的a这个品质可理解为全神关注的(absorbed)/精确的(accurate)/能干的(able)/乐于助人的(accommodating)/友好的(amicable)]。类似httpd, mysqld最后的d字母意为守护程序。
安装
easy_install supervisor
or
pip3 install supervisor
or
sudo apt install supervisor
配置
执行命令echo_supervisord_conf
回显默认的初始配置文件。
可通过管道命令将配置文件重定向到某个目录,eg:echo_supervisord_conf > /etc/supervisord.conf
以root用户运行需要增加 user=root
启动 supervisor
supervisord -c supervisor.conf
supervisorctl
- 当配置文件更新后, 可用
supervisorctl update
更新配置, 但并未立即生效,需重启. - 一般使用
supervisorctl reload
更新配置并重启所有程序. - 停止所有程序
supervisorctl stop all
- 启动/停止/重启某程序
supervisorctl {start:stop:restart} program_name
- 查看所有子进程的状态
supervisorctl
启用web监控服务
通过浏览器远程管理,启动停止程序,查看日志等,非常方便。
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
sudo service supervisor restart
http server控制面板生效
http://127.0.0.1:9001/
配置Redis开机自启服务
sudo supervisorctl
whereis supervisor
sudo vim /etc/supervisord.conf
[program:RedisServer]
command=/opt/redis/src/redis-server /opt/redis/redis.conf
autostart=true
autorestart=true
startsecs=0
user=root
stdout_logfile=/var/log/redis/stdout.log
stderr_logfile=/var/log/redis/stderr.log
mkdir /var/log/redis # 首先创建日志目录
sudo supervisorctl update # 更新 supervisord.conf 后生效
配置简单的http服务
例如要在vps上启用一个简单的http服务,用于分享download目录下的文件
日志目录需要手动创建mkdir /var/log/
[program:http-server]
command=python3 -m http.server
directory=/home/download/
redirect_stderr = true
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/simple-http-server_err.log
stdout_logfile=/var/log/simple-http-server_out.log
配置服务的环境变量
如果程序需要环境变量,那么需要手动添加environment
首先使用env
查看所有的环境变量,然后拼接所需的变量,通过:
和,
间隔,示例:
[program:xxx-server]
;...
environment=PYTHONPATH=/home/xxx/xxxx:/home/xxx/ooo,PATH=/home/xxx/lib
;...
子进程状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AMP8Qf8O-1613829904942)(supervisor-subprocess-transitions.png)]
七种状态
- STOPPED
- STARTING
- RUNNING
- BACKOFF
- STOPPING
- EXITED
第八种UNKNOWN(由supervisord出错引起)