1. 程式人生 > >監控某程序工作狀態的指令碼

監控某程序工作狀態的指令碼

很多時候,我們需要監控某個指令碼是否正在執行,如果不在執行,則需將它重啟。

思路:

監測指令碼或程序的執行狀態,可以通過ps -ef,再加上grep命令進行定位。

如果該程序在執行,則上述命令會輸出資訊。

如果不輸出資訊,則通過 sh 指令碼名稱 的命令方式進行重啟。

上述動作需要一直執行,故需要通過死迴圈來執行。

測試:

1, 我先建立一個test.sh的指令碼,內容如下,每隔兩秒中輸出一段資訊

#!/bin/bash

#測試指令碼

while true
do
    echo '我是測試指令碼';

    sleep 2;

done

執行:

[email protected]❯~/桌面$ 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 不輸入被監測指令碼的路徑,報錯

[email protected]❯~/桌面$ sh shMonitor.sh
請輸入需要監測的指令碼絕對路徑

3.2 輸入被監測指令碼的路徑

[email protected]❯~/桌面$ 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!