转载: www.leroyling.com/archives/Su…
进程管理工具Supervisor
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
Supervisor的安装
(1)安装Python包管理工具(easy_install)
ps 如果没有安装的话
yum install python-setuptools
(2)安装Supervisor
easy_install supervisor
配置Supervisor应用守护
(1)通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
(2)然后新建一个conf.d的文件夹
mkdir /etc/supervisor/conf.d
(3)然后查看路径下的supervisord.conf。
在文件尾部添加如下配置。
...
;[include]
;files = relative/directory/*.ini
;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = conf.d/*.conf
(4)为你的程序创建一个.conf文件,放在目录"/etc/supervisor/conf.d/"下
touch your-application-name.conf
配置文件的内容如下
[program:your-application-name] ;程序名称,终端控制时需要的标识
command= java -jar your-application-name.jar ; 运行程序的命令
directory=/root/your-application-pwd ; 你的程序所在的命令执行的目录路径
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/your-application-name.err.log ; 错误日志文件,路径可以自己定义
stdout_logfile=/var/log/your-application-name.out.log ; 输出日志文件,路径可以自己定义
user=root ; 进程执行的用户身份
stopsignal=INT
(5)配置文件搞定之后,运行supervisord,查看是否生效
supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep your-application-name
ps 如果服务已启动,修改配置文件可用“supervisorctl reload”命令来使其生效
supervisorctl reload
配置Supervisor开机启动
(1)进入到以下目录
cd /usr/lib/systemd/system
(2)新建一个supervisord.service文件
touch supervisord.service
编辑文件内容
[Unit]
Description=Supervisor
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
(3) 执行命令
systemctl enable supervisord
(4) 执行命令来验证是否为开机启动
systemctl is-enabled supervisord
附录-常用的相关管理命令
supervisorctl restart <application name> ;重启指定应用
supervisorctl stop <application name> ;停止指定应用
supervisorctl start <application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用