很多时候,我们需要监控某个脚本是否正在执行,如果不在执行,则需将它重启。
思路:
监测脚本或进程的执行状态,可以通过ps -ef,再加上grep命令进行定位。
如果该进程在执行,则上述命令会输出信息。
如果不输出信息,则通过 sh 脚本名称 的命令方式进行重启。
上述动作需要一直执行,故需要通过循环来执行。
测试:
1, 我先创建一个test.sh的脚本,内容如下,每隔两秒中输出一段信息
#!/bin/bash
#测试脚本
while true
do
echo '我是测试脚本';
sleep 2;
done
执行:
c80k2@c80k2-Vostro-3667❯~/桌面$ sh test.sh
我是测试脚本
我是测试脚本
我是测试脚本
.
.
.
2, 写一个监测脚本shMonitor.sh,内容如下:
#!/bin/bash
#监测某脚本运行情况 $0为当前脚本的路径 $1为被监测脚本的绝对路径
if [ -z "$1" ]
then
echo "请输入需要监测的脚本绝对路径"
exit 2
else
#获取到该路径对应的脚本命令名称
cmd=$(echo ${1##*/})
fi
while true
do
st=$(ps -ef | grep "$cmd" | grep -v grep | grep -v "$0")
if [ -z "$st" ]
then
echo $1 "脚本终止,即将重启。"
sh $1
else
echo $1 "脚本正在运行"
fi
sleep 0.5
done
3, 执行监测脚本
3.1 不输入被监测脚本的路径,报错
c80k2@c80k2-Vostro-3667❯~/桌面$ sh shMonitor.sh
请输入需要监测的脚本绝对路径
3.2 输入被监测脚本的路径
c80k2@c80k2-Vostro-3667❯~/桌面$ sh shMonitor.sh ~/桌面/test.sh
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
/home/c80k2/桌面/test.sh 脚本正在运行
.
.
.
3.3 我们把test.sh脚本停掉,再执行监测脚本,看结果
ps -aux | grep 'test.sh' | grep -v grep | grep -v 'shMonitor.sh'
c80k2 9374 0.0 0.0 4504 1648 pts/30 S+ 21:56 0:00 sh /home/c80k2/桌面/test.sh
kill 9374
/home/c80k2/桌面/test.sh 脚本终止,即将重启。
我是测试脚本
我是测试脚本
.
.
.
我是测试脚本
Terminated
/home/c80k2/桌面/test.sh 脚本终止,即将重启。
我是测试脚本
我是测试脚本
.
.
.
我是测试脚本
Terminated
/home/c80k2/桌面/test.sh 脚本终止,即将重启。
我是测试脚本
我是测试脚本
可以看到,每次将test.sh杀掉之后,监控进程就会将它重启,bingo!