安装和使用守护进程--Supervisor

安装和使用守护进程--Supervisor

Posted by liu kai on October 29, 2019

安装和使用守护进程–Supervisor

起因

** 在Linux上有时候需要开启一个阻塞进程来监听操作。当ssh连上服务器,直接运行一个阻塞进程,然后退出服务器时,这个阻塞进程也会跟着关闭。**

解决办法

使用python开发的Supervisor守护进程。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

安装配置Supervisor

Centos安装

yum install epel-release

yum install -y supervisor

Ubuntu

apt-get install supervisor

配置

在/etc/supervisor/目录下有个conf.d的文件夹和supervisord.conf配置文件。打开配置文件

vim supervisord.conf

我们可以看到

[include] files = /etc/supervisor/conf.d/*.conf

意思是Supervisor在启动的时候会加载conf.d目录下所有的conf配置文件。

horizon守护进程配置参考

laravel的horizon守护进程配置

cd /etc/supervisor/conf.d/

vim horizon.conf

填入以下内容

[program:horizon] process_name=%(program_name)s command=php /home/wwwroot/www.guaosi.com/artisan horizon ; 阻塞进程执行的命令 autostart=true ; 阻塞进程是否跟着Supervisor一起开机自动 autorestart=true ; 阻塞进程被异常退出是否自动重启 user=www ; 由哪个用户执行阻塞进程的命令 redirect_stderr=true stdout_logfile=/home/wwwroot/www.guaosi.com/storage/logs/horizon.log ; 阻塞进程打印到控制台的内容写到哪里

启动服务

Centos启动

systemctl start supervisord

Ubuntu启动

supervisord -c /etc/supervisor/supervisord.conf

开机自启

Centos开机自启

新建文件 supervisord.service

supervisord.service

[Unit] Description=Supervisor daemon

[Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s

[Install] WantedBy=multi-user.target

将文件拷贝到/usr/lib/systemd/system/

cp supervisord.service /usr/lib/systemd/system/

启动服务

systemctl enable supervisord

验证一下是否为开机启动

systemctl is-enabled supervisord

Ubuntu开机自启

编辑/etc/rc.local文件

vi /etc/rc.local

在exit 0之前加入以下命令

/usr/local/bin/supervisord

保存并退出 最后修改rc.local权限

chmod +x /etc/rc.local

常用命令

重新启动配置中的所有程序

supervisorctl reload

启动某个进程(program_name=你配置中写的程序名称)

supervisorctl start program_name

查看正在守候的进程

supervisorctl

停止某一进程 (program_name=你配置中写的程序名称)

supervisorctl stop program_name

重启某一进程 (program_name=你配置中写的程序名称)

supervisorctl restart program_name

停止全部进程

supervisorctl stop all

注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

注意

被Supervisor守护的进程都是常驻内存的,即如果修改了被守护的进程的源码,需要重启对这个进程的守护才能生效,否则还是未修改前的。

supervisorctl restart program_name