一、Supervisor安装与配置文件
可参考 https://blog.csdn.net/yuanqs_1992/article/details/80833898进行下载安装
二、Supervisor下项目的配置
1、进入/etc/supervisor/conf.d目录,这里假设你要配置的项目名称为myproject:
则创建配置文件:
touch myproject.conf
2、然后编辑配置文件:
vim myproject.conf
复制粘贴如下几行:
[program: myproject]
directory=/home/dlnu/myproject
environment=PYTHONPATH=/home/dlnu/myproject
command= python3 /home/dlnu/myproject/manage.py
autorestart=true ; 程序意外退出是否自动重启
autostart=true ; 是否自动启动
stderr_logfile=/etc/supervisor/conf.d/myproject.err.log ; 错误日志文件
stdout_logfile=/etc/supervisor/conf.d/myproject.out.log ; 输出日志文件
stopsignal=INT
startsecs=0 ; 自动重启间隔
根据你项目的实际情况修改, 保存退出后重新加载一下:
supervisorctl reload
这样就大功告成!
supervisorctl restart project_name # 重启项目的supervisor
三、常用命令
查看单个任务状态:supervisorctl status
查看任务状态:supervisorctl status
启动守护进程:supervisord -c /etc/supervisor/supervisord.conf
启动任务:supervisorctl start 服务名
停止任务:supervisorctl stop 服务名
重启任务:supervisorctl restart 服务名
重载配置:supervisorctl reload
四、常见报错
下面是三种常见的通用报错:
第一类:
报错信息: unix:///tmp/supervisor.sock no such file
解决办法: 原因是supervisor默认配置会把socket文件和pid守护进程生成在/tmp/目录下,/tmp/目录是缓存目录,Linux会根据不同情况自动删除其下面的文件。
1. 创建 supervisor.sock :
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
2. vi /etc/supervisord.conf 打开配置文件,修改如下标示的几行即可:
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
file=/var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除
[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/var/log/supervisor/supervisord.log ; 修改为 /var/log 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; 修改为 /var/run 目录,避免被系统删除
...
[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=unix:///var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除
3. 再尝试重新启动:supervisord -c /etc/supervisor/supervisord.conf()
注:若出现报错[unix:/// var/run/supervisor.sock refused connection]也可以运行此条命令
4.更新配置文件
supervisorctl update
至此就可以了,socket文件supervisor.sock和守护进程supervisord.pid两个文件放在/var/run/下面,log文件supervisord.log放在/var/log/下面。如果还不行,则重启服务器。
第二类:
报错信息:
Error: .ini file does not include supervisorctl section
解决办法:
又是一个权限问题的,步骤:
1. 先确保supervisord.conf中有[supervisord],[supervisorctl]有这两个基本模块,还有[program:XXX]自己程序的配置(可以在supervisord.conf也可以在/etc/supervisor/*.ini中)
2. 最关键的两个命令:chmod +x /usr/bin/supervisord
chmod +x /usr/bin/supervisorctl
chmod +x /etc/supervisord.conf主要是把把相关文件都授权了
3. 把supervisord杀掉后再次启动supervisord
第三类:
报错信息:
Exited too quickly (process log may have details)
如果前面的问题都解决了,但还是会遇到这个问题,恭喜你已经离胜利很近了,起码supervisord本身已经没什么问题了^_^
解决办法:
1. 先确认[program:XXX]中自己的程序的command=<启动命令>和 directory=<运行命令的路径>没有问题,python是不是用的自己要的环境的python(比如虚拟环境的),log文件的文件夹是不是已经创建(没创建的话supervisor没权限生成log文件),以及改log文件是不是授权给所有用户了(可参考前面的解决办法chmod +x aaaaa.log)
2. 确保用上面的配置中的command在指定路径可以直接运行不会报错,这时候一般就不会有什么问题了。这时候tail你自己的log文件一般就能看到log信息,启动失败报错的信息也会在你的log文件中,照着解决后supervisorctl reload就好了。
3. 如果上面的命令确保可以跑,但还是没法正常运行,也看不到自己程序的报错(不然你就能根据报错解决问题了),那么恭喜,你遇到了跟我一样的情况。我的解决办法很诡异,尝试把[program:XXX]中的名字换成了一个跟启动命令不一样的另一个名字(不要太短),reload之后居然就可以跑了。。。。嗯,很不合常理,但是对我来说确实管用了。