进程管理程序supervisor使用实践
1. Supervisor介绍
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,实现如下功能:
- 监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
- 实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
- supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
(来源:Supervisor使用详解)
2. 安装和配置
pip3 install supervisor
安装完成后,我们在/etc/
下创建supervisor
目录,然后使用下述命令创建服务端配置文件:
cd /etc/
mkdir supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
然后创建进程配置管理目录/etc/supervisor/conf.d/
和示例进程配置文件test.conf:
mkdir conf.d/
vim test.conf
将以下内容复制到test.ini
文件中:
; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:test_py]
command=python3 /root/test_supervisor.py
;numprocs=1 ; 默认为1
;process_name=%(program_name)s ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/root/ ; 执行 command 之前,先切换到工作目录
user=root ; 使用 root 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true
redirect_stderr=true ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/test_py.log
loglevel=info
查看supervisord目录的结构:
.
├── conf.d
│ └── test.ini
└── supervisord.conf
其中supervisord.conf
是服务端配置文件,conf.d
目录用于存放管理进行的配置文件。
这里我们创建一个示例示例配置文件test.ini
。
、;
这里是注释的符号,[program:test_py] 是进程名称,主要是command,用来配置程序启动的命令。
3. 启动supervisor
现在可以启动supervisor,如果你修改了ip、port、username、password,需要把配置文件中的;[inet_http_server]
内容取消注释;同时请修改test.ini中的目录为你系统中存在的目录。
这里为了能让公网访问服务,该部分修改为以下内容:
[inet_http_server]
port=0.0.0.0:9001
最后两行,让supervisor读取指定目录下的ini文件作为配置文件:
[include]
files = /etc/supervisor/conf.d/*.ini
这里别忘记我们创建的[program:test_py]
示例进程配置文件,我们这里创建一个test_supervisor.py
文件作为我们第一个受supervisor管理的进程,将test_supervisor.py
放在/root/下,内容如下:
import time
while True:
print(10)
time.sleep(30)
运行以下命令启动supervisor:
supervisord -c /etc/supervisor/supervisord.conf
访问host:9001
打开下面的页面:
4. supervisor常用命令
supervisorctl update # 更新配置
supervisorctl reload # 重启配置中的所有程序
supervisorctl status # 查看管理的程序状态
supervisorctl shutdown # 停止supervisor
supervisorctl restart <application name> # 重启指定应用
supervisorctl stop <application name> # 停止指定应用
supervisorctl start <application name> # 启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用
或者执行supervisorctl进入命令行,然后交互的执行supervisorctl后的指令。
5. 问题集合
5.1 Unlinking stale socket /tmp/supervisor.sock
使用unlink /tmp/supervisor.sock
来解决。
$ supervisord -c /etc/supervisor/supervisord.conf
Unlinking stale socket /tmp/supervisor.sock
$ unlink /tmp/supervisor.sock
5.2 使用nohup不输出日志
是因为supervisor无法监控nohup程序。