Linux下如何让程序后台运行?
关掉终端继续让程序运行的方法?
Linux ssh状态下如何后台运行程序?
……
开门见山
其实,解决办法有很多种,nohup
,setsid
,screen
等,但这些可能都不是那么的完美。
如果有一个命令,想让它可靠的在后台运行,能监控其运行状态,停止运行后还没能自动重启等
再或者,我们有多个进程,需要同时启动、关闭多个进程,而不是一个一个地敲命令启动。
或许,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 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=51 time=23.5 ms
64 bytes from 123.125.114.144: icmp_seq=3 ttl=51 time=23.6 ms
64 bytes from 123.125.114.144: icmp_seq=4 ttl=51 time=23.5 ms
64 bytes from 123.125.114.144: icmp_seq=5 ttl=51 time=31.2 ms
64 bytes from 123.125.114.144: icmp_seq=6 ttl=51 time=23.6 ms
64 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:09
supervisor> help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
supervisor> status
ping_baidu:ping_baidu_00 RUNNING pid 26153, uptime 0:08:34
supervisor> 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
unix 2 [ 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
的更多用法,请参考 官方文档 。