Supervisord 进程管理工具

Supervisord 进程管理工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 安装
yum install supervisor

# 加载自定义配置
vim /etc/supervisord.conf
[include]
files = supervisord.d/*.conf

# 新建 laravel.conf
vim /etc/supervisord.d/laravel.conf
[program:laravel]
process_name=%(program_name)s_%(process_num)02d
command=php /data/wwwroot/laravel.com/artisan queue:work --sleep=3
autostart=true
autorestart=true
user=www
numprocs=4
redirect_stderr=true
stdout_logfile=/data/supervisor/laravel.com/queue.log

# 新建 /data/supervisor/laravel.com 目录,并设置文件属组
mkdir -p /data/supervisor/laravel.com
chown -R www:www /data/supervisor

# 运行命令
supervisorctl reread
supervisorctl update
supervisorctl start laravel:*

# 问题
# supervisorctl reread - error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
supervisord -c /etc/supervisord.conf

# Error: Another program is already listening on a port that one of our HTTP servers is configured to use.
# 第一种:
ps aux | grep supervisord
kill 进程号
# 第二种
supervisorctl
reread
update
start all
status

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 启动 supervisord, 默认去找 $CWD/supervisord.conf
supervisord

# 启动 supervisord, 到指定路径下去找配置文件
supervisord -c /etc/supervisord.d/xxx.conf

# 启动 supervisord 管理的所有进程
supervisorctl start all

# 停止 supervisord 管理的所有进程
supervisorctl stop all

# 启动 supervisord 管理的某一个特定进程
supervisorctl start program-name

# 停止 supervisord 管理的某一个特定进程
supervisorctl stop program-name

# 重启所有进程
supervisorctl restart all

# 重启某一进程
supervisorctl reatart program-name

# 查看 supervisord 当前管理的所有进程的状态
supervisorctl status

# 读取有更新(增加)的配置文件, 但不会启动新添加的程序, 也不会重启任何程序
supervisorctl reread

# 重启配置文件修改过的程序, 配置没有改动的进程不会收到影响而重启
supervisorctl update

# 载入最新的配置文件, 停止原有的进程并按照新的配置启动
supervisorctl reload

/etc/supervisord.conf 说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; socket 文件路径, supervisorctl 用 XML_RPC 和 supervisord 通信就是通过它进行的
;chmod=0700 ; default 0700, socket 文件权限
;chown=nobody:nogroup ; socket 文件属组

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; supervisord 主进程的日志路径
;directory=/tmp ; default is not to cd during start, 当 supervisord 作为守护进程运行的时候, 启动 supervisord 进程之前, 会先切换到这个目录
;nocleanup=true ; default false, 在 supervisord 进程启动的时候, 把以前子进程产生的日志文件 (路径为 AUTO 的情况下) 清除掉. 如果想要看历史日志, 可以设置为 true
;childlogdir=/tmp ; default $TMP, 当子进程日志路径为 AUTO 的时候, 子进程日志文件的存放路径

;[program:theprogramname] ; 管理的子进程, ":" 后面的是名字
;command=/bin/cat ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; default %(program_name)s, 进程名 - 如果 numprocs 参数为 1 的话, 就不用管这个参数
;numprocs=1 ; default 1, 启动进程的数量
;directory=/tmp ; def no cwd, 进程运行前, 会先切换到这个目录
;umask=022 ; umask for process (default None)
;priority=999 ; default 999, 子进程启动关闭优先级, 优先级低的, 最先启动, 关闭的时候最后关闭
;autostart=true ; default true, 子进程将在 supervisord 启动后被自动启动
;autorestart=true ; default true, 子进程挂掉后自动重启的情况, 有三种情况:false | unexpected | true
false 无论什么情况下都不会被重新启动;
unexpected 只有当进程的退出码不在下面的 exitcodes 里面定义的退出码的时候才会被自动重启;
true 只要子进程挂掉, 将会被无条件的重启
;startsecs=10 ; default 1, 子进程启动多少秒之后, 此时状态如果是 running, 则认为启动成功
;startretries=3 ; default 3, 当进程启动失败后, 最大尝试启动的次数, 当超过 3 次后, supervisor 将把此进程的状态置为 FAIL
;exitcodes=0,2 ; default 0,2, 和上面的的 autorestart=unexpected 对应
0%