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

原创 2017年07月10日 17:21:23

一、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

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring定时任务.线程池,自定义多线程配置

定时任务及多线程配置xml xml version="1.0" encoding="UTF-8"?> beans xmlns="http://www.springframework.org/...

spring @scheduled并发

1、基于springboot的项目开启自动配置, 2、创建作业类 package com.plateno.booking.sync.vienna.test; import org.slf4j.Lo...

Shell脚本监控、拉起Nimbus和Supervisor进程

Nimbus和Supervisor都是快速失败,无状态的进程,Nimbus的单点问题一直没有很好的解决办法,所以我们可以对相关进程进行监控,在其挂掉时尝试重启。 在之前的项目里,比较常用的方式是通过...

怎样让自己的程序进程不让别人强行关闭掉

写了一个像杀毒软件的软件,不能让别人结束这个程序的进程。 有一种方法是将自己进程提升为系统进程的,这种没有试过 另外一种方法,拦截API函数,有两种方法: 1.在强行关闭一个进程时系统调...

Linux下批量杀掉 包含某个关键字的 程序进程

有时候因为一些情况,需要把 linux 下符合某一项条件的所有进程 kill 掉,又不能用 killall 直接杀掉某一进程名称包含的所有运行中进程(我们可能只需要杀掉其中的某一类或运行指定参数命令的...

C# 强制关闭当前程序进程(完全Kill掉不留痕迹)

    /// /// 运行DOS命令 /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID ...

Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。

程序、进程和线程 1.程序是计算机指令的集合,它以文件的形式存储在磁盘上。 2.进程:是一个程序在其自身的地址空间中的一次执行活动。 3.进程是资源申请、调度和独立运行的单位,因此,它使...

程序进程关闭不了?我们使用系统ntsd命令

用法为打开cmd 后输入以下命令就可以结束进程: 方法一:利用进程的PID结束进程 命令格式:ntsd -c q -p pid 命令范例: ntsd -c q -p 1332 (结束PID为13...

linux下使用supervisor监控应用程序

1 应用场景 应用程序需要24小时不间断运行。这时可使用supervisor监控应用程序的进程。当发生应用程序内部错误退出、进程被杀死等情况时,自动重启应用程序。 2 supe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用supervisor实现程序从服务目录拉到发布目录并实时监控拉起死掉的程序进程
举报原因:
原因补充:

(最多只允许输入30个字)