shell脚本检测监控程序

1. 需求

使用脚本监控指定程序是否运行,如果程序没有运行,启动程序。

2. 脚本

#!/bin/bash

# 判断是否脚本传参
if  [ ! -n "$1" ] ;then
	echo -e "\033[31m*脚本传参为空,请检查... \033[0m"
	exit 1
fi

# 时间格式
ltime=$(date "+%Y-%m-%d %H:%M:%S")
# log日志文件
logFile='./monitor.log' 

pid=`ps -ef | grep "$1"| grep -v grep | grep -v "$0" | grep -v grep |head -n 1| awk '{print $2}'`
if [ "${pid}" = "" ]; then 
	echo "${ltime} 首次检测,未检测到程序$1进程,等待重启..." >> "${logFile}"
else
	echo "${ltime} 首次检测,$1程序正在运行,pid=${pid}" >> "${logFile}"
fi

#功能需求: 监控程序是否运行,如果程序没有运行,那么启动程序。
while [ true ]
do
    time=$(date "+%Y-%m-%d %H:%M:%S")
	#过滤出目标进程信息,如果pid为空串说明目标进程未运行,反向过滤掉grep进程和本进程shell信息, 因为这两个进程信息中包含目标进程的名字
	pid=`ps -ef | grep "$1"| grep -v grep | grep -v "$0" | grep -v grep |head -n 1| awk '{print $2}'`
	if [ "${pid}" = "" ]
	then 
		echo "${time} 未检测到程序$1进程,重新启动程序中...." >> "${logFile}"
		nohup $1  >/dev/null 2>&1 &   #重新程序,后台运行,这里也可以传参程序脚本运行
		
		pid1=`ps -ef | grep "$1"| grep -v grep | grep -v "$0" | grep -v grep |head -n 1| awk '{print $2}'`
		if [ "${pid1}" = "" ];then 
			echo "${time} 重启程序$1失败" >> "${logFile}"
		else
			echo "${time} 重启程序$1成功,pid=${pid1}" >> "${logFile}"
		fi
	else
		echo "${time} $1程序正在运行,pid=${pid}" >> "${logFile}"
	fi
	
	sleep 1
done

注意:由于脚本是循环检测,可后台运行脚本。

# nohup sh monitor.sh &    或者 sh monitor.sh &

查看当前后台运行的命令

jobs命令:查看当前终端后台运行的任务

ps命令:查看当前的所有进程

你可能感兴趣的:(脚本)