使用shell編寫的極簡WatchDog

WatchDog-看門狗程序用於自動監測進程的運行狀態,並按照須要重啓進程。對於嵌入式系統的存儲服務、網絡服務程序常常由於各類錯誤出現中斷,可使用WatchDog來自動保持服務的可用。WatchDog可使用shell來進行編寫,這裏給出一個極簡的實現。shell

一、基本邏輯

  • 檢查進程是否存在。
  • 若是進程不存在,則啓動之。
  • 若是進程存在,則跳過,休眠給定時間。
  • 再次檢查進程,重複上面的步驟。

二、極簡版本

編寫腳本,以下:ubuntu

#!/bin/bash
while true; do
    ret=`ps -aux | grep "22.*openthings" | grep -v grep | wc -l`
    if [ $ret -eq 0 ]; then
        nohup sshpass -p password ssh -y -NgL 2200:localhost:22 username@openthings.x.x &
    fi
    sleep 6
done

每6秒鐘檢查一次ssh命令的進程,若是退出了自動從新啓動。安全

More simple:bash

#!/bin/bash
while true; do
    sshpass -p password ssh -y -NgL 2200:localhost:22 username@openthings.x.x &
    sleep 10
done

三、運行WatchDog

使用nohup和&讓其在後臺運行,也可使用screen軟件或放在rc.local做爲服務運行。網絡

nohup ssht-watchdog &

在本地機器,檢查是否在運行:ssh

ps -x

在遠程機器,檢查ssh的端口:測試

netstat -a | grep "220\|2088"

四、詳細說明

4.1 提取進程信息

以下:this

ps -aux | grep "22.*192.168.1.1" | grep -v grep | awk -F " " '{print $1,$2}'

能夠根據指定的信息(上面爲 「22.*192.168.1.1」)查詢進程信息列表,排除grep本身(grep -v grep),經過awk提取信息,按照空格分離字段,並輸出前兩個字段的值(進程ID/tty)。能夠靈活運用來操做進程,如kill 指定進程等等。ps的參數在不一樣操做系統有所不一樣,請根據系統而定。spa

4.2 WatchDog腳本

以下:操作系統

#!/bin/bash

# 獲取當前時間。
now=`date '+%Y-%m-%d %H:%M:%S'`

# 檢測間隔的休眠時間。
sleepTime=6

# 檢查進程的關鍵詞,".*"爲「且」關係,有順序。
# 必定要包含在下面的命令中,不然或不斷啓動新的進程!
grepFlag='22.*openthings'

# 基本目錄和日誌文件名。
baseDir="/home/smt/openthings/tutools"
thisLog='/home/smt/openthings/tutools/tulog'

# 檢查的主循環,無窮循環。
while true; do
    # 按照上面設定的關鍵詞獲取進程,若是存在返回1。
    ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`

    # 若是不存在,則啓動之。
    if [ $ret -eq 0 ]; then
        cd $baseDir
        echo "$now process not exists ,restart process now... " > "$thisLog"
        
        # 能夠是任何shell命令。這裏以ssh任務說明,不一樣操做系統和版本的ssh命令參數不一樣。
        # 密鑰對須要預先生成,並上傳公鑰到服務端,追加到/etc/ssh/authrized_keys文件。
        # 這裏是DropBear的用法。
        ssh -K 30 -y -fNgL 2200:localhost:22 username@openthings.x.x -i /opt/etc/.ssh/id_ecdsa >/dev/null 2>&1 &
        # 這裏是openssh的用法。
        #ssh -y -fNgL 2200:localhost:22 username@openthings.x.x -i ~/.ssh/id_ecdsa >/dev/null 2>&1 &

        echo "$now restart done ..... "  > "$thisLog"
        cd $curDir
    else # 若是已存在,輸出日誌便可,不作任何其它操做。
        echo "$now process exists , sleep $sleepTime seconds " > "$thisLog"
    fi

    # 休眠一段時間,從新循環。
    sleep $sleepTime
done

其中的運行任務,上面使用免密鑰登陸(參考:《在Asus Merlin固件的Dropbear使用及免密登陸》、《SSH免密直接登陸方法》),也可使用ssdpass來完成(參考:《Ubuntu上使用sshpass遠程腳本免密安全交互》、《SSH如何保持鏈接-Ubuntu》),以下:

nohup sshpass -p mypassword ssh -y -fNgL 2200:localhost:22 username@openthings.x.x &
  • 注意:
    • 這裏的ssh和sshpass的後臺運行機制不一樣,參考後面的資料。
    • 具體操做系統的實現有一些差別,須要進行仔細測試後部署。

參考資料

ssh遠程運行命令,退出終端後繼續執行,參考:

相關文章
相關標籤/搜索