周期性脚本

最近在工作中碰到一个需求,需要在Linux系统上去定时监控一个进程是否还存在,如果不存在的话就要去启动它,要完成这个需求首选使用脚本来实现,首先,要在Linux系统上去定时执行一个脚本就要用到Linux的周期性任务计划,

crontab -l 可以查看当前用户有哪些计划任务, 
crontab -e 可以编辑计划任务,这个命令本质上是去/etc/crontab这个路径下,当前用户的周期性
任务信息会保存在这里,所以它是来编辑这里的信息

下面是我修改后的文件

*/1 * * * * /sbin/monitor_ru.sh

它表示每过一分钟去执行sbin/monitor_ru.sh这个脚本,这个脚本是监控程序,而在这次需求中,首先要求开机后十分钟再去启动监控进程是否存在,之后每一分钟都去检测一次,如果不存在则启动它,那么问题就来了,一分钟和十分钟不是一个固定的值,所以在程序里不能把这个值固定,首先想到的就是采用计数的方式,那么这个计数值保存在哪呢?也想了很多方法,什么保存环境变量之类的,但都不能很好的解决这个问题,最后还是传统一点,保存在文件里吧!首先需要解决的问题就是把字符型转换成数字型,这样才能计数到十分钟,但是shel它是一种弱类型的编程语言,它不像C语言那样可以直接转换,这个问题我也是搜索了很久,最后终于解决,来看代码吧

#!/bin/sh
#这里是保存的文件路径,如果它存在什么都不做,如果不存在先创建文件,再写入0
if [ -e "/tmp/log/ru_minutes.txt" ];then
        :
else
        touch /tmp/log/ru_minutes.txt
        echo 0 > /tmp/log/ru_minutes.txt
fi
#最大次数,一分钟执行一次,10就是10分钟
max=10
#num每次去获取文件中的值
num=`cat /tmp/log/ru_minutes.txt`
#将字符类型转换为数据类型
num=$(($num+0))
#要监控的两个进程的信息
app=$(ps -ef | grep ru_app | grep -v grep)
agent=$(ps -ef | grep ru_agent | grep -v grep) 
if [ -z "$app" ];then
	#如果进程不存在,并且计数大于等于10去启动进程,也就是需求中的在开机之后第一次在十分钟之后去检测
	#-ge表示大于等于,如果大于等于十分钟就会去启动脚本
        if [ $num -ge $max ];then
                cd /tmp/rsys/bin/ && ./ru_app master >/tmp/log/ru_app.log 2>&1 &
        fi
fi
if [ -z "$agent" ];then
        if [ $num -ge $max ];then
                cd /tmp/rsys/bin/ && ./ru_agent >/tmp/log/ru_agent.log 2>&1 &
        fi
fi
#如果计数小于10,则把计数值加1,写入文件中
if [ $num -lt $max ];then
        num=$(($num+1))
        echo $num > /tmp/log/ru_minutes.txt
fi

可以看到,每一分钟执行的脚本首先会读取文件计数值,如果小于十分钟会增加这个数值,这个时候尽管检测到进程不存在也不会去启动它,预留十分钟的检测时间,十分钟之后计数值不再增加,这个时候如果检测到进程不存在就会立即去启动进程,也即是一分钟去检测一次,最后测试,确实可以达到预期的目标,但是这种做法的风险就是这个文件随时可以被别人修改或者删除,这都会影响该脚本的执行。

发布了33 篇原创文章 · 获赞 2 · 访问量 1028

猜你喜欢

转载自blog.csdn.net/weixin_41791581/article/details/103049786