使用supervisor实现程序从服务目录拉到发布目录并实时监控拉起死掉的程序进程

xiaoxiao2021-02-28  88

一、supervisor的安装与使用入门

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)

 

二、inotifywait实现目录监控安装

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

 

三、supervisord.conf

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

四、supervisor重新加载配置启动新的进程

http://blog.csdn.net/shudaqi2010/article/details/51153961

 

 

 

转载请注明原文地址: https://www.6miu.com/read-33828.html

最新回复(0)