Fork me on GitHub

Ubuntu 中的进程管理工具——supervisor

supervisor 是一款很好用的进程管理工具,其命令也很简单,本文基于 Ubuntu18.04 环境对其做一个简单的介绍。

supervisor安装

1
2
3
4
5
6
7
8
9
# ubuntu安装: 
sudo apt-get install supervisor

# centos安装:
yum install -y supervisor

# 基于python库安装
pip2 install supervisor
easy_install supervisor

安装好之后,默认 supervisor 服务已经启动完成。

配置文件在 /etc/supervisor/conf.d/ 路径下,

supervisor 管理进程的配置文件,这里就简单举例:

1
2
3
4
5
6
7
8
[program:task]                                       # 管理进程的命名
command=python test.py -c test.conf          # 执行的命令
stderr_logfile=/var/log/supervisor/test.log      # 错误日志输出路径
stdout_logfile=/var/log/supervisor/test.log      # 日志输出路径
directory=/root/test                    # 命令执行的工作空间
autostart=true                       # 自动启动
user=root                          # 指定用户
autorestart=true                      # 自动重启</pre>

进程配置文件配好之后,然后执行:

1
supervisorctl reload

至此配置基本完成,进程也启动起来了。

supervisor 有 supervisord 和 supervisorctl 两种命令类型,supervisord 是服务相关的命令,supervisorctl 是客户端相关的命令,它们的使用方法很简单。

查看 supervisorctl 和启动子进程方式

1
2
3
4
supervisorctl status           # 查看supervisorctl状态
supervisorctl start nginx # 启动子进程nginx
supervisorctl stop nginx # 关闭子进程nginx
supervisorctl restart nginx # 重启子进程nginx

说明:

running:进程处于运行状态

starting:Supervisor 收到启动请求后,进程处于正在启动过程中

stopped:进程处于关闭状态

stopping:Supervisor 收到关闭请求后,进程处于正在关闭过程中

backoff:进程进入 starting 状态后,由于马上就退出导致没能进入 running 状态

fatal:进程没有正常启动

exited:进程从 running 状态退出

常用命令:

supervisorctl start programxxx,启动某个进程

supervisorctl restart programxxx,重启某个进程

supervisorctl stop groupworker ,重启所有属于名为groupworker这个分组的进程( start,restart 同理)

supervisorctl stop all,停止全部进程,注:start、restart、stop 都不会载入最新的配置文件。

supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。

supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

supervisor,启动和停止的日志文件存放在 /var/log/supervisor/supervisord.log
注意:显式用 stop 停止掉的进程,用 reload 或者 update 都不会自动重启

常见报错:

1
2
3
4
5
6
7
8
9
10
11
12
Traceback (most recent call last):
File "/usr/local/bin/supervisorctl", line 7, in <module>
from supervisor.supervisorctl import main
File "/usr/local/lib/python2.7/dist-packages/supervisor/supervisorctl.py", line 36, in <module>
from supervisor.options import ClientOptions
File "/usr/local/lib/python2.7/dist-packages/supervisor/options.py", line 26, in <module>
from supervisor.datatypes import process_or_group_name
ImportError: cannot import name process_or_group_name

# 这是在执行supervisor相关命令报的错,基本可以看出是安装的问题
# 解决方式
easy_install supervisor
1
2
3
4
5
6
root@ubuntu:~# supervisorctl
unix:///var/run/supervisor.sock no such file
supervisor>

# 这有可能是由于supervisor服务没有启动 #解决办法
service supervisor start
1
2
3
4
5
6
7
8
9
10
error: <class ‘socket.error’>, [Errno 2] No such file or directory: file:/usr/lib/python2.7/socket.py line: 224

# 错误原因可能是 supervisor 服务未启动
# 解决办法
service supervisor start

# 也有可能是配置文件中没有指定用户
# 解决办法
进入/etc/supervisor/conf.d
找到指定的配置文件,加入 user=root
------------- 本文结束感谢您的阅读 -------------