很多时候,我们需要监控某个脚本是否正在执行,如果不在执行,则需将它重启。

思路:

监测脚本或进程的执行状态,可以通过ps -ef,再加上grep命令进行定位。

如果该进程在执行,则上述命令会输出信息。

如果不输出信息,则通过 sh 脚本名称 的命令方式进行重启。

上述动作需要一直执行,故需要通过死循环来执行。

测试:

1, 我先创建一个test.sh的脚本,内容如下,每隔两秒中输出一段信息

#!/bin/bash

#测试脚本

while true
do
    echo '我是测试脚本';

    sleep 2;

done

执行:

c80k2@c80k2-Vostro-3667❯~/桌面$ sh test.sh
我是测试脚本
我是测试脚本
我是测试脚本
.
.
.

2, 写一个监测脚本testMonitor.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!

11-22 12:16