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命令:查看当前的所有进程