本文链接:https://blog.youkuaiyun.com/weixin_44602187/article/details/86598121
Supervisor是一个进程管理工具
用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断。当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了Supervisor
1、安装与配置
第一步:安装supervisor(前提要有python2)
wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz
tar zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
python setup.py install
第二步:创建配置文件
echo_supervisord_conf > /etc/supervisord.conf
第三步:修改配置文件(注意:以下以数字开头的代表行号,可以直接定位修改)
mkdir /var/log/supervisord/
touch /var/log/supervisord/supervisord.log
vim /etc/supervisord.conf
12 file=/var/run/supervisor.sock ;socket 路径,如果不设置,则supervisorctl不能用
18 [inet_http_server] ;开启web页面服务
19 port=*:9999 ;自定义端口号
20 username=admin ;认证用户名,非必须设置项
21 password=123456 ;认证用户名密码,可以直接使用明码
23 [supervisord] ;定义服务端进程supervisord的相关属性。必须设置项
24 logfile=/var/log/supervisord/supervisord.log ;指定supervisord主进程的日志路径
28 pidfile=/var/run/supervisord.pid ;指定pid路径, 非必须设置
48 serverurl=unix:///var/run/supervisor.sock ;supervisorctl连接supervisord,路径与12行的file一致
140 [include] ;把配置信息写到多个自定义文件中
141 files = /root/supervisor-3.1.3/supervisord/*.conf
1
2
3
4
5
6
7
8
9
10
11
第四步:写*.conf配置文件(自定义一个简单的实例)
mkdir /root/supervisor-3.1.3 /supervisord/
vim /root/supervisor-3.1.3 /supervisord/app.conf
[program:app]
command=python /root/app/app.py #执行的命令,如果是程序的话,需要指定在前台运行
#以上两条必要,以下都是设置参数非必要
#directory=/root/app/ 进入到这个目录中
#stdout_logfile=/root/app/app.log 成功日志
#stderr_logfile=/root/app/app.log 错误日志
#user=root 启动elasticsearch 的用户
#numprocs=1 Supervisor启动这个程序的多个实例,
#autostart=true 设置为随 supervisord 启动而启动
#autorestart=true 设置为随 supervisord 重启而重启
#startretries=3 设置elasticsearch 重启的重试次数
#priority=1 权重值,值越低,越早启动,越晚关闭。默认999
1
2
3
4
5
6
7
8
9
10
11
12
mkdir /root/app/
vim /root/app/app.py
from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
return "Hello World"
if __name__=="__main__":
app.run(port=88)
1
2
3
4
5
6
7
2、测试是否成功
supervisord #初始启动
supervisorctl #进入交互式
>update #更新conf配置文件
>status #查看状态
输出信息:app RUNNING pid 27905, uptime 0:00:03
curl 127.0.0.1:88
输出信息:Hello World
3、配置各程序的实例(在/root/supervisor-3.1.3 /supervisord/目录下创建)
实例1:sshd
vim sshd.conf
[program:sshd]
command=/usr/sbin/sshd -D
1
2
实例2:httpd
vim httpd.conf
[program:httpd]
#管理守护程并使在前台保持运行
command=/usr/sbin/httpd -DFOREGROUND
autostary=true
autorestart=true
startretries=3
stdout_logfile=/var/log/supervisord/apache.log
#loglevel=info
1
2
3
4
5
6
7
8
实例3:Nginx
nginx默认以daemon方式启动的,用supervisord来管理nginx,在配置文件里添加一行设置daemon off让nginx以非daemon方式启动。(supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序)。注意添加这一行后Nginx系统(命令)运行就在前台运行,占用终端。
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
daemon off;
events {
1
2
3
vim nginx.conf
[program:nginx]
command=/usr/local/nginx/sbin/nginx
stdout_logfile=/tmp/nginx.log
stderr_logfile=/tmp/nginx.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
priority=55
1
2
3
4
5
6
7
8
9
实例4:Redis
vim redis.conf
[program:redis]
directory=/usr/local/src/redis-2.6.16
command=/usr/local/src/redis-2.6.16/src/redis-server redis.conf
stdout_logfile=/tmp/redis_access.log
stderr_logfile=/tmp/redis_error.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
priority=10
1
2
3
4
5
6
7
8
9
10
实例5:java项目(java.jar放到/date/sites/java/目录下)
vim java.conf
[program:java]
command=java -jar java.jar
directory=/data/sites/java
autostart=true
autorestart=true
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
stderr_logfile=/data/logs/java/err.log
stdout_logfile=/data/logs/java/out.log
stopsignal=INT
redirect_stderr=true
1
2
3
4
5
6
7
8
9
10
11
12
把supervisor加入开机自启动服务(CentOS7.X系统),利用/etc/rc.local
echo “/usr/bin/supervisord -c /etc/supervisord.conf” >> /etc/rc.local
/etc/rc.local是/etc/rc.d/rc.local的软连接
如果开机启动不生效,则首先需要检查下/etc/rc.d/rc.local是否具有可执行权限
4、supervisor相关命令
supervisord --启动
supervisorctl reload --修改完配置文件后重新启动
supervisorctl update --更新有变化的*.conf配置文件
supervisorctl status --查看进程状态
supervisorctl start 进程名 --启动XXX进程
supervisorctl stop 进程名 --停止XXX进程
supervisorctl stop all --停止全部进程
supervisorctl #进入交互式,命令与上面相同
5、报错问题
问题1:
supervisorctl reload
报错:error: <class ‘socket.error’>, [Errno 111] Connection refused: file: /usr/lib64/python2.7/socket.py line: 224
supervisorctl
报错:unix:///var/run/supervisor.sock refused connection
报错原因:supervisor没有启动
问题处理:启动supervisor
supervisord
问题2:
supervisorctl
报错:httpd BACKOFF Exited too quickly (process log may have details)
supervisor> start httpd
报错:httpd: ERROR (abnormal termination)
报错原因:
*.conf配置文件中的’command=/usr/sbin/httpd’写少了参数
问题处理:
改成:‘command=/usr/sbin/httpd -DFOREGROUND’
问题3:
supervisorctl
报错:httpd FATAL Exited too quickly (process log may have details)
supervisor> start httpd
报错:apache: ERROR (abnormal termination)
报错原因:
supervisord管理的进程必须由supervisord来启动,supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序。linux系统程序已经启动httpd进程,造成supervisor启动不了。
问题处理:
systemctl stop httpd 把系统进程停了
supervisorctl start httpd 再启动
问题4:
supervisorctl
>update
>status
报启动中:nginx STARTING #(一般报启动中都是有问题的)
>status
报错:nginx BACKOFF Exited too quickly (process log may have details)
>start nginx
报错:nginx: ERROR (abnormal termination)
>status
报错:nginx FATAL Exited too quickly (process log may have details)
报错原因:
supervisord管理的程序是非daemon程序(要在前台运行),nginx默认以daemon方式启动的。Nginx启动了,就放在后台运行了。
问题处理:
在配置文件里添加一行设置daemon off让nginx以非daemon方式启动。
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
daemon off;
events {
————————————————
版权声明:本文为优快云博主「褪sεの记忆」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_44602187/article/details/86598121