from http://www.tuicool.com/articles/Ejm2u2
原文 http://www.51bbo.com/archives/2120
Supervisor是一个进程管理工具,官方的说法
用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断。当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了Supervisor
这个工具主要就两个命令:
supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令
supervisorctl:启动supervisor的命令行窗口。
安装(Centos):
# yum install python-setuptools
# easy_install supervisor
如果easy_install不好使就从官方下载:
然后通过python安装:
# tar zxf supervisor-3.1.3.tar.gz
# cd supervisor
# python setup.py install
成功安装后可以登陆python控制台输入import supervisor查看是否能成功加载。
[root@JAVA_2 deploy]# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import supervisor
>>>
生成配置文件(supervisord.conf):
http://blog.csdn.net/firefoxbug/article/details/8188804
processname.txt 配置
[root@JAVA_2 d]# cat processname.txt
service-device-web.jar doordu_device
service-house-web.jar doordu_house
service-user-web.jar doordu_user
service-admin-web.jar doordu_admin_web
service-flow-web.jar doordu_flow
echo_supervisord_conf > /etc/supervisord.conf
修改配置文件:
在supervisord.conf最后增加(分号后边的表示注释,可以不写):
[program:doordu_user]
command=/usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2101 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-user-web.jar --spring.profiles.active=prod
directory=/home/service_java/deploy/
user=root
autostart=true
startretries=3
autorestart=true
[program:doordu_device]
command=/usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2102 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-device-web.jar --spring.profiles.active=prod
directory=/home/service_java/deploy/
user=root
autostart=true
startretries=3
autorestart=true
[program:doordu_house]
command=/usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-house-web.jar --spring.profiles.active=prod
directory=/home/service_java/deploy/
user=root
autostart=true
startretries=3
autorestart=true
[program:doordu_flow]
command=/usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2105 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-flow-web.jar --spring.profiles.active=prod
directory=/home/service_java/deploy/
user=root
autostart=true
startretries=3
autorestart=true
[program:doordu_admin_web]
command=/usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2104 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-admin-web.jar --spring.profiles.active=prod
directory=/home/service_java/deploy/
user=root
autostart=true
startretries=3
autorestart=true
[program:watchdog]
command=/home/service_java/d/watchdog.sh
directory=/home/service_java/d/
user=root
autostart=true
startretries=1
autorestart=true
[program:compensation]
command=/home/service_java/d/compensation.sh
directory=/home/service_java/d/
user=root
autostart=true
startretries=1
autorestart=true
进程服务说明
[program:doordu_user] 用户模块服务
[program:doordu_house] 房产模块服务
[program:doordu_device] 设备模块服务
[program:doordu_flow] 其他模块服务
[program:doordu_admin_web] 统一网关入口
[program:compensation] 补偿服务
PUB_DIR=/home/service_java/publish/
while true;do
for jarfile in `ls $PUB_DIR`; do
if [[ "$jarfile" =~ .*\.jar$ ]];then
touch $PUB_DIR$jarfile
echo "touch $PUB_DIR$jarfile" >> logs.txt
else
echo "skip $jarfile" >> logs.txt
fi
done
sleep 5
Done
[program:watchdog] inotifywait实现目录监控:把jar包从pubish目录移动到deploy目录
#!/bin/bash
SERVICE_HOME=/home/service_java
PUBLISHDIR=$SERVICE_HOME/publish/
DEPLOYDIR=$SERVICE_HOME/deploy/
/usr/local/bin/inotifywait -e close_write --format %f $PUBLISHDIR|while read LINESTATUS
do
JARFILE=$(echo $LINESTATUS |sed 's/-[0-9]*\.[0-9]*\.[0-9]*//')
if [[ $JARFILE =~ .*\.jar$ ]];then
SRV_NAME=$(cat processname.txt|grep $JARFILE |awk '{print $2}')
echo mv $PUBLISHDIR$LINESTATUS $DEPLOYDIR$JARFILE >> logs.txt
mv $PUBLISHDIR$LINESTATUS $DEPLOYDIR$JARFILE
echo supervisorctl restart $SRV_NAME >> logs.txt
supervisorctl stop $SRV_NAME
supervisorctl restart $SRV_NAME
echo done >>logs.txt
fi
sleep 1
done
启动:
/usr/bin/supervisord
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'supervisor==3.3.1','console_scripts','supervisord'
__requires__ = 'supervisor==3.3.1'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('supervisor==3.3.1', 'console_scripts', 'supervisord')()
)
supervisorctl //打开命令行
查看状态
supervisorctl status
compensation RUNNING pid 1442, uptime 25 days, 3:54:54
doordu_admin_web RUNNING pid 15297, uptime 1:43:36
doordu_device RUNNING pid 15356, uptime 1:43:20
doordu_flow RUNNING pid 10838, uptime 3:12:17
doordu_house RUNNING pid 20095, uptime 0:02:16
doordu_user RUNNING pid 15430, uptime 1:43:03
watchdog RUNNING pid 20116, uptime 0:02:13
注意:如果修改了 /etc/supervisord.conf ,需要执行supervisorctl reload来重新加载配置文件,否则不会生效。。。
我们可以关掉一个进程
发现,守护进程会立马重新启动此服务进程
[root@JAVA_2 d]# ps -ef | grep admin
root 1514 1193 2 16:23 ? 00:00:55 /usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2104 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-admin-web.jar --spring.profiles.active=prod
root 2818 1110 0 16:55 pts/0 00:00:00 grep admin
[root@JAVA_2 d]# kill -9 1514
[root@JAVA_2 d]# ps -ef | grep admin
root 2825 1193 24 16:55 ? 00:00:00 /usr/local/jdk1.8.0_102/bin/java -jar -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.69 -Dcom.sun.management.jmxremote.port=2104 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false service-admin-web.jar --spring.profiles.active=prod
root 2837 1110 0 16:55 pts/0 00:00:00 grep admin
http://blog.csdn.net/shudaqi2010/article/details/51153961