软件工程中,守护进程是非常行之有效的方案。能够让我们的一些指令在崩溃之后可以自我重新启动,从而保障业务上的持续使用。
这里就从0开始教大家安装Supervisor。
一,下载安装
安装有好多种方法,直接下载安装包安装,或者yum安装或者pip安装都可以。这次我们选择的是pip安装:
1.安装supervisor
pip install supervisor
2.生成配置文件
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
3.修改supervisor的配置文件:
①因为tmp下系统会自动清理一些东西,为了防止Supervisor的一些核心文件被删除,将部分目录进行调整,防止出现unix:///tmp/supervisor.sock no such file问题
[unix_http_server]---》file---》把/tmp/supervisor.sock改成/run/supervisor/supervisor.sock
[supervisord]---》logfile---》把/tmp/supeervisor.log改成/var/log/supervisor/supervisor.log
[supervisorctl]---》serverurl---》修改为unix:///run/supervisor/supervisor.sock
②对该目录下所有的进程进行管理
[include]---》files---》修改为/etc/supervisor/supervisor.d/*.conf
4.启动supervised
supervisord -c /etc/supervisord/supervisord.conf
二,可能遇到的问题
-
supervisord -c /etc/supervisord.conf 启动时报错
Error: Cannot open an HTTP server: socket.error reported errno.ENOENT (2)
For help, use /usr/bin/supervisord -h原因,默认配置的目录不存在,手动创建一个就好了。
mkdir /run/supervisor
-
Error: The directory named as part of the path ./log/supervisord.log does not exist解决方案
出现这个提示,只要创建一个:log文件夹,并且在该文件夹里新建这个文件:supervisord.log
supervisord.log 里面写入内容:
[log for main_server]
保存。这样就可以成功调用supervisord.conf 文件了
-
Supervisorstart all没问题当时当你单独启动一个进程却报错 :
ERROR (spawn error) 。
这个时候从表面报错你很难看出什么问题。教大家一招
supervisorctl tail program_name stdout
这个时候就可以先显示出问题所在。比如这次我的报错就是supervisor : pcntl_signal() has been disabled for security reasons。
显而易见,pcntl_signal这个函数被禁用了,这个时候只要打开宝塔把这个函数删除就可以了
三,把Supervisor加入自启动
ubuntu
ubuntu开机自启有多种方式,你随意。编辑/etc/rc.local文件,
vi /etc/rc.local
在exit 0 之前加入以下命令
/usr/local/bin/supervisord
保存并退出。
最后修改rc.local权限
chmod +x /etc/rc.local
加入systemctl管理
vim /lib/systemd/system/supervisor.service
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
上述文件编写后,执行如下命令即可:
systemctl enable supervisor 加入开机自启动服务
systemctl daemon-reload 重新载入systemd,扫描新的或有变动的单元(必要步骤)
systemctl start supervisor.service 启动服务
systemctl stop supervisor.service 停止服务
systemctl restart supervisor.service 重新启动服务
systemctl reload supervisor.service 重载配置文件
systemctl status supervisor.service 查看服务状态(显示的类似于操作记录)
验证一下是否为开机启动
systemctl is-enabled supervisord