进程管理程序supervisor使用实践

1. Supervisor介绍

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,实现如下功能:

  1. 监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
  2. 实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
  3. 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程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章