文档章节

shell 动态进程守护

罗布V
 罗布V
发布于 2016/10/14 23:02
字数 909
阅读 30
收藏 2
config general general
    option enable 1

config monitor
    option name 'scplc'
    option enable 1
    option pschkstr 'sc-serv plc'
    option type     'application'
    option tmpfile '/tmp/monitor/plc.mon'
    option mqttkey '/app/mon/plc/status'
    option timeLimit 60 
    option execcmd ''

config monitor
    option name 'scgpio'
    option enable 1
    option pschkstr 'sc-serv gpio'
    option type     'application'
    option tmpfile '/tmp/monitor/gpio.mon'
    option mqttkey '/app/mon/gpio/status'
    option timeLimit 60 
    option execcmd ''

flash="0"
true="1"
false="0";
disable="0"
enable="1"
configName="scmonitor"
printHelp(){
	clear
	echo "USAGE:"
	echo "-g <monitor type> get current moitor enable status "
	echo "-l view current all montoir list"
	echo "-s <monitorName> <monitorValue> set monitor state"
	echo "-a autoManage "
	echo "-e enable cron"
	echo "-d disable cron"
	echo "add <name> <enable> <pschkstr> <sevicename> <tmpfile> <mqttkey> <execcmd> <timeLimit>"
  echo "example:"
	echo "	check -l"
	echo "			plc"
	echo "			pjlink"
	echo "   check -g plc"
	echo "			current monitor state:0"
	echo "   check -s plc 0"
}

#检测线程是否存在
function_thread_check(){
	#count= ${ps |grep 'sc-serv plc' | grep -v 'grep' | wc -l}
	count=$( ps | grep "$*" | grep -v 'grep' | wc -l )
	if [ 0 == $count ];then
		echo false
	else
		echo true
	fi
}

#获取当前所有模块的名称
function_getMonitorList(){
	count=$(uci get $configName.general.count)

	for i in $(seq 0 $count);
	do
		name=$(uci get $configName.@monitor[$i].name)
		echo $name

	done
}
#获取状态
function_getMonitorStats(){
    count=$(uci get $configName.general.count)

    for i in $(seq 0 $count);
    do
		name=$(uci get $configName.@monitor[$i].name)
        if [ "$name" == "$1" ]; then
            state=$(uci get $configName.@monitor[$i].enable)
            echo $1 stats is $state
        fi
    done
}
#获取当前的时间差
function_getTimeCompare(){
	currTime=$( date +%s)
	lastTime=$1
	#tmpTime= $("$currTime - $lastTime")

	echo $(($currTime - $lastTime))
}

function_setMonitorState(){
	count=$(uci get $configName.general.count)
	for i in $(seq 0 $count);
	do
		name=$(uci get $configName.@monitor[$i].name)
        old_sate=$(uci get $configName.@monitor[$i].enable)
		if [ "$name" == "$1" ]; then
			state=$(uci set $configName.@monitor[$i].enable=$2)
            echo "$1 set success"
		fi
	done
}

# 自动化处理流程
function_autoManage(){
	count=$(uci get $configName.general.count)
	monitorState=$(uci get $configName.general.enable)

	if [ $monitorState == "0" ]; then
		echo "current server monitor disable"
		return 
	fi

	for i in $(seq 0 $count);
	do
		name=$(uci get $configName.@monitor[$i].name)
        psChkstr=$(uci get $configName.@monitor[$i].pschkstr)
		tmpfile=$(uci get $configName.@monitor[$i].tmpfile)
        type=$(uci get $configName.@monitor[$i].type)
		result=$(function_thread_check $psChkstr)
		MonitorStats=$(uci get $configName.@monitor[$i].enable)

		if [ "$MonitorStats" == "$disable" ]; then 
			echo  $name current Current status is disable 
			continue	
		fi

		if [ "$result" == "false" ]; then
      echo "Services have been shut down, which is restarting"
			#execCmd=$(uci get sc-monitor.@monitor[$i].execcmd)
			$(/etc/init.d/$name start)
		else
      if [ $type == "application" ]; then #application不做文件检测
          echo "$name Operating normally"
          continue
      fi

			if [ ! -e "$tmpfile" ]; then
				$(/etc/init.d/$name stop)
				$(/etc/init.d/$name start)
				echo "restart $name server"
                continue
			else
				lastTime=$(cat $tmpfile)
				timeLimit=$(uci get $configName.@monitor[$i].timeLimit)
				result=$(function_getTimeCompare $lastTime )

				if [ "$result" -gt "$timeLimit" ]; then  #如果当前返回的值大于允许值
					$(rm -rf $tmpfile)
					$(/etc/init.d/$name stop)
					$(/etc/init.d/$name start)
				fi

				echo $result $timeLimit
			fi

		fi
        echo "$name Operating normally"
	done
}

#移除服务
function_removeMonitor(){
	MonitorName=$1
	tmp=$(uci get $configName.general.count)
	for i in $(seq 0 $tmp);
	do
		name=$(uci get $configName.@monitor[$i].name)
		if [ "$name" == "$MonitorName" ]; then
			count=$((  $tmp - 1 ))
			$(uci delete $configName.@monitor[$i])
			$(uci set $configName.general.count=$count)
			$(uci commit $configName)
		fi
	done
}

function_EnableCron(){
	$(uci set $configName.general.enable=1)
	$(uci commit $configName)
}

function_DisableCron(){
	$(uci set $configName.general.enable=1)
	$(uci commit $configName)
}

[ "$(cat /proc/uptime | awk -F. '{print $1}')" -gt 300 ] || exit 0

if [ "$#" -eq 0 ]; then
	printHelp
	exit 1
fi

if [ "$1" == "-s" ]; then
	if [  "$2" == "" ] || [ "$3" == "" ]; then
		exit 1
	fi
	function_setMonitorState $2 $3
	exit 1

fi

if [ "$1" == "add" ]; then
	if [ "$2" == "" ]; then
		echo "plese input type"
		exit 1
	fi
	if [ "$3" == "" ]; then
		echo "plese input eanbled"
		exit 1
	fi

	if [ "$4" == "" ]; then
		echo "plese input pschkstr"
		exit 1
	fi
	if [ "$5" == "" ]; then
		echo "plese input sevicename "
		exit 1
	fi
	if [ "$6" == "" ]; then
		echo "plese input tmpfile"
		exit 1
	fi
	if [ "$7" == "" ]; then
		echo "plese input mqttkey"
		exit 1
	fi
	if [ "$8" == "" ]; then
		echo "plese input execcmd"
		exit 1
	fi
	if [ "$9" == "" ]; then
		echo "plese input timeLimit"
		exit 1
	fi
	tmp=$(uci get $configName.general.count)
	#$count=$(( $count + 1 ))
	count=$((  $tmp + 1 ))

	$(uci add $configName monitor)
	$(uci add_list $configName.@monitor[$count].name="$2")
	$(uci add_list $configName.@monitor[$count].enable="$3")
	$(uci add_list $configName.@monitor[$count].pschkstr="$4")
	$(uci add_list $configName.@monitor[$count].servicename="$5")
	$(uci add_list $configName.@monitor[$count].tmpfile="$6")
	$(uci add_list $configName.@monitor[$count].mqttkey="$7")
	$(uci add_list $configName.@monitor[$count].execcmd="$8")
	$(uci add_list $configName.@monitor[$count].timeLimit="$9")
	$(uci set $configName.general.count=$count)
	$(uci commit $configName)
	exit 1
fi

while getopts g:s:lear:d opt
do
	case "$opt" in
		g)
		function_getMonitorStats $OPTARG
		;;
		e)
		function_EnableCron
		;;
		d)	function_DisableCron
		;;
		l)
		function_getMonitorList
		;;
		r)
		function_removeMonitor $OPTARG
		;;
		a)
		function_autoManage
		;;
		?)
		clear
		printHelp ;;
	esac
done

© 著作权归作者所有

共有 人打赏支持
上一篇: electron与react整合
下一篇: RequireJS模块加载
罗布V
粉丝 13
博文 60
码字总数 47114
作品 0
温州
程序员
私信 提问
Linux:进程间关系和守护进程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/triorwy/article/details/80896335 更多学习资源尽在Linux学习总结 1.进程组 概念:进程组是一个或多个进程的...

Triorwy
2018/07/03
0
0
Linux 守护进程原理及实例(Redis、Nginx)

1. 什么是守护进程 守护进程,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令查看系统的守护进程,输出如下所示: Linux系统中常见的守护进程有:...

yangbodong22011
2017/11/28
0
0
Shell 高级编程

Shell 高级编程 原创 2016-11-04 景峯 Netkiller Shell 高级编程 http://netkiller.github.io/journal/shell.html Mr. Neo Chen (陈景峯), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街......

neo-chen
2016/11/04
347
0
从进程组、会话、终端的概念深入理解守护进程

从进程组、会话、终端的概念深入理解守护进程 一、写在前面 「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」。我们常见的 httpd、named、sshd 等服务都是以守...

肖邦0526
2018/04/29
0
0
浅谈linux性能调优之七:裁剪系统服务

通常部署应用服务,对单台服务器而言只提供单一服务,甚至利用集群技术,分布式技术多台服务器来提供高可用,高性能的服务。这样对于大多系统提供多种服务 的现状显然不符,这就要求我们管理...

我爱吃葱花
2014/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

泛型就这么简单

前言 从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~ 今天要复习的是泛型,泛型在Java中也是个很...

群星纪元
36分钟前
3
0
大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

大家晚上好,我是今天的提笔人嗅嗅。 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰“巴黎不哭”,已经不能表达我对这场文化之殇的惋惜之痛,人类伟大的建筑在一瞬间被毁灭。 世界...

forespider
47分钟前
0
0
mysql函数substring_index的用法

substring_index 按索引字符位进行截取字符串 substring_index(“待截取的字符串”,“截取数据依据的字符”,截取字符的位置N) 第三个参数可正,可负。正数表示索引字符前面的字符串,负数...

echojson
48分钟前
2
0
好程序员web前端分享用CSS和JS打造一个简单的图片编辑器

好程序员web前端分享用CSS和JS打造一个简单的图片编辑器,本文主要是利用CSS的 filter和简单的Jquery代码来实现一个简单的图片编辑器,包括对图片的透明度,黑白,图片亮度等调节。 CSS filt...

好程序员IT
57分钟前
2
0
浅析spring mvc的细节

spring mvc 整体结构 系统监听到请求 -> 通知tomcat -> 根据web.xml 通知相应的拦截器(spring mvc 通常指DispatcherServlet) --> 检查url是否有相匹配的请求实现 --> 拿到请求实现bean的适配...

最爱肉肉
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部