Supervisor,进程管理利器。 让程序后台运行!

2018-05-05 小惟 45

Linux下如何让程序后台运行?

关掉终端继续让程序运行的方法?

Linux ssh状态下如何后台运行程序?

……

开门见山

其实,解决办法有很多种,nohupsetsidscreen 等,但这些可能都不是那么的完美。

如果有一个命令,想让它可靠的在后台运行,能监控其运行状态,停止运行后还没能自动重启等

再或者,我们有多个进程,需要同时启动、关闭多个进程,而不是一个一个地敲命令启动。

或许,Supervisor 正是你所需要的!

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

Supervisor是一个客户端/服务端系统,它允许用户监视和控制类UNIX操作系统上的大量进程。

简而言之,Supervisor是一个python开发的一套进程管理程序。

更多介绍,请查阅 官方文档 。

安装

可以通过apt-get、yum安装,既然Supervisor是基于python编写的,那我们就用pip安装好了。

如果没有python环境,不知道pip是什么,那就选择其他方式安装吧 https://pip.pypa.io/en/stable/installing/ 。

以下安装必须要有网哦!

安装pip,如果已经安装就不用了

curl https://bootstrap.pypa.io/get-pip.py | python

pip install pip --upgrade
安装Supervisor
pip install supervisor
升级setuptools工具,
pip install setuptools --upgrade

否则可能执行echo_supervisord_conf 会报以下错误:

[root@localhost ~]# echo_supervisord_conf

Traceback (most recent call last):
File "/usr/bin/echo_supervisord_conf", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
working_set.require(__requires__)
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
raise DistributionNotFound(req)pkg_resources.DistributionNotFound: meld3>=0.6.5

运行echo_supervisord_conf 命令,这将打印一个“示例”Supervisor配置文件到您的终端输出。

配置

拷贝配置文件到/etc下

echo_supervisord_conf > /etc/supervisord.conf

编辑配置文件

vim /etc/supervisord.conf

找到最后一行

;[include];files = relative/directory/*.ini

删除分号,修改为:

[include]files = supervisord.d/*.conf

意思就是,配置文件包含/etc/supervisord.d/目录下的文件,这样我们就可以在/etc/supervisord.d/目录下创建我们自己需要后台运行的应用程序的配置啦。

创建目录

mkdir /etc/supervisord.d

添加需要后台运行的程序

这里我们以ping baidu.com 为例,众所周知这条命令运行后,会一直在终端执行输出,当关闭终端或手动ctrl+c就停止,怎么能让关闭终端后让然在后台继续不停的ping 下去呢?

编辑配置文件

vim /etc/supervisord.d/ping_baidu.conf

添加:

[program:ping_baidu]; 这是进程名称,可以随意取,不带变量也可以
process_name=%(program_name)s_%(process_num)02d; 这是要执行的程序命令,也可以是可执行的shell脚本文件
command=ping baidu.com; 自动启动
autostart=true; 自动重启
autorestart=true; 以哪个用户执行
user=root; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置,默认为1。。非必须设置
numprocs=1; 日志路径
stdout_logfile=/tmp/supervisor_ping_baidu.log

启动supervisord

supervisord -c /etc/supervisord.conf

如果没有报错,supervisord就启动啦,并且ping_baidu也在后台运行啦,查看一下输出的日志:

[root@localhost ~]# cat /tmp/supervisor_ping_baidu.log 
PING baidu.com (123.125.114.144) 56(84) bytes of data.64 bytes from 123.125.114.144: icmp_seq=1 ttl=51 time=23.7 ms64 bytes from 123.125.114.144: icmp_seq=2 ttl=51 time=23.5 ms64 bytes from 123.125.114.144: icmp_seq=3 ttl=51 time=23.6 ms64 bytes from 123.125.114.144: icmp_seq=4 ttl=51 time=23.5 ms64 bytes from 123.125.114.144: icmp_seq=5 ttl=51 time=31.2 ms64 bytes from 123.125.114.144: icmp_seq=6 ttl=51 time=23.6 ms64 bytes from 123.125.114.144: icmp_seq=7 ttl=51 time=23.5 ms

这样就大告成功啦,ping baidu.com 这样一条命令就可以在后台永不休止的不停歇的pingbaidu.com啦。

控制台 supervisorctl

我们运行supervisorctl,各种操作我们后台运行的程序啦。

[root@localhost ~]# supervisorctl 
ping_baidu:ping_baidu_00 RUNNING pid 26153, uptime 0:07:09supervisor> help

default commands (type help <topic>):=====================================addexitopenreloadrestart start tail 
availfgpid removeshutdownstatusupdate 
clearmaintailquitrereadsignalstopversion

supervisor> status
ping_baidu:ping_baidu_00 RUNNING pid 26153, uptime 0:08:34supervisor> stop ping_baidu:ping_baidu:ping_baidu_00: stopped
supervisor> quit

最后

别忘了,关闭ping_baidu 哦,删除 ping_baidu.conf 文件哦,不然‘百度’被你给整瘫痪了,那可咋整哈?

rm -rf /etc/supervisord.d/ping_baidu.conf

然后关闭supervisord。

[root@localhost ~]# netstat -napl |grep supervisor
unix2[ ACC ] STREAM LISTENING 10412096 26152/python/tmp/supervisor.sock.26149[root@localhost ~]#kill 26152

最后的最后

将supervisor加入服务,并开机启动supervisor,不选择此方法的可以移步啦。

根据不同的系统,有不同的脚本,参考 https://github.com/Supervisor/initscripts

这里以Centos为例,我们选择:

https://github.com/Supervisor/initscripts/blob/master/redhat-init-mingalevme

vim /etc/init.d/supervisord

将上述地址文件内容拷贝到 vim /etc/init.d/supervisord  ,将第32行

PIDFILE=/var/run/supervisord.pid

改为:

PIDFILE=/tmp/supervisord.pid

保存后就可以添加至服务并设置开机启动啦。

chkconfig --add supervisord
chkconfig supervisord --level 345 on

启动、关闭、重启supervisord 命令

service supervisord start
service supervisord stop
service supervisord restart

最后,师父领进门,修行在个人,supervisor 的更多用法,请参考 官方文档 。