Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启.
supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.另一个进程管理工具:S6
Debian / Ubuntu可以直接通过apt安装:
1
| sudo apt-get install supervisor
|
如果是通过pip安装的话,就需要echo_supervisord_conf程序生成supervisor的初始化配置文件:
1 2 3
| sudo pip install supervisor mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
|
supervisor安装完成后会生成三个执行程序:supervisortd 守护进程服务,用于接收进程管理命令.supervisorctl 客户端,用于和守护进程通信,发送管理进程的指令.
echo_supervisord_conf 生成初始配置文件程序
然后,给我们自己开发的应用程序编写一个配置文件,让supervisor来管理它.每个进程的配置文件都可以单独分拆,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名
vim server.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [program:python8010] command = /usr/bin/python3 HttpsRunner.py directory = /server/app1.6 user = root redirect_stderr = true stdout_logfile_maxbytes = 150MB stdout_logfile_backups = 20 stdout_logfile = /server/app1.6/python8010.log [program:mongod] ;command = /mongo/mongodb-linux-x86_64-ubuntu1404-3.2.10/bin/mongod --dbpath /mnt/mongodb --auth command = /mongo/mongodb-linux-x86_64-ubuntu1404-3.2.10/bin/mongod -f /server/app1.6/mongodb.conf directory = /server/app1.6 user = root redirect_stderr = true stdout_logfile_maxbytes = 150MB stdout_logfile_backups = 20 stdout_logfile = /server/app1.6/mongodb.log
|
Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程.否则提示Exited too quickly (process log may have details)异常.
启动Supervisor服务:
1
| supervisord -c /etc/supervisor/supervisord.conf
|
管理进程:
1 2 3 4 5 6 7 8 9 10 11 12 13
| supervisorctl status supervisorctl stop mongod supervisorctl start python8010 supervisorctl restart python8001 supervisorctl stop groupworker supervisorctl stop all supervisorctl reread/reload supervisorctl update supervisorctl tail <APP_NAME>
|
进入CLI管理台:
Web管理界面
1 2 3 4 5
| vim /etc/supervisor/supervisord.conf [inet_http_server] ; inet (TCP) server disabled by default port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) username=root ; (default is no username (open server)) password=root ; (default is no password (open server))
|
重启Supervisor服务,如果有Unlinking stale socket /var/run/supervisor.sock 执行unlink /var/run/supervisor.sock:
1 2
| ps aux |grep supervisord supervisord -c /etc/supervisor/supervisord.conf
|
开机启动Supervisor:
方法1:
Linux 在启动的时候会执行 /etc/rc.local 里面的脚本,所以只要在这里添加执行命令就可以
以下内容需要添加在 exit 命令前,而且由于在执行 rc.local 脚本时,PATH 环境变量未全部初始化,因此命令需要使用绝对路径.
1
| /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
如果是 Ubuntu 16.04 以上,rc.local 被当成了服务,而且默认是不会启动,需要手动启用一下服务
启动rc.local服务:
1
| sudo systemctl enable rc-local.service
|
方法二:
Supervisord 默认情况下并没有被安装成服务,它本身也是一个进程.官方已经给出了脚本可以将 Supervisord 安装成服务,
可以参考这里查看各种操作系统的安装脚本,但是我用官方这里给的 Ubuntu 脚本却无法运行.
安装方法可以参考 serverfault
这个脚本下载下来后,还需检查一下与我们的配置是否相符合,比如默认的配置文件路径,pid 文件路径等,如果存在不同则需要进行一些修改