shellスクリプトモニタリング&自動引き揚げプログラム

3044 ワード

自分がサーバで長期にわたって実行する必要があるプログラムを走っているときは、たまに変な理由で切ることがありますが、人為的にチェックするのは面倒なので、自動的な検出と掛け引きを実現したほうがいいです.
良いツールはsupervisorで、これはpythonベースのプロセスモニタリングツールで、簡単な構成を行うことができて私たちの需要に達して、あなたのプロセスを監視して、自動的に掛けたプログラムを引き起こすことができます.
しかし、私と同じようにroot権限のないサーバを使用すると、インストールツールが面倒なことになります.shellスクリプトを自分で書いて監視したり、自動的に引っ張ったりすることもできます.難しくありません.
以下はshellモニタリングスクリプトmonitorです.sh:
#!/bin/bash

now=`date '+%Y-%m-%d %H:%M:%S'` #   log     
grepFlag='myWorkingProcess.js' #         
thisLog='./watchlog' #     log    

baseDir="."
sleepTime=60s #     

#             run.sh
if [ ! -f "$baseDir/run.sh" ]; then
    echo "$baseDir/run.sh missing, check again" >> "$thisLog"
    exit
fi

#     (0<1)
while [ 0 -lt 1 ] 
do
    now=`date '+%Y-%m-%d %H:%M:%S'`
    ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`
    if [ $ret -eq 0 ]; then #   ps             
        echo "$now process not exists ,restart process now... " >> "$thisLog"
        ./run.sh
        echo "$now restart done ..... "  >> "$thisLog"
    else
        echo "$now process exists , sleep $sleepTime seconds " >> "$thisLog"
    fi
    sleep $sleepTime
done

基本コードにはコメントがありますが、まず-fでスクリプトrunを引くと判断します.shが存在するかどうか.次に無限ループ(0が1未満のループ)でps grepをターゲットプロセスのチェックを行い、存在しない場合(retは0を返す)は引き上げ、存在する場合はlogのみを打つ.そしてsleepは間隔を置いています.このsleepは自由で、サポートされている時間単位が秒、分、時で、デフォルトの単位は秒です.次のことができます.
sleep 1    #   1 
sleep 1s   #   1 
sleep 1m   #   1 
sleep 1h   #   1  

ビジネスシーンに基づいて間隔時間を選択します.ここのbaseDir変数に注意してください.私は監視付きのプログラム、検出スクリプト、引き上げスクリプトを同じディレクトリの下に置いたので、一つです.十分です.具体的には、自分のディレクトリ構造に基づいて修正します.
コードの中で私达がechoのlogの出力をすべて指定のログのファイルの中に置くことを见ることができて、ここで私达は>>を使って、もし>>を使うならば、それでは毎回logを打って全文をカバーして、最初から书いて、もし>>を使うならば、ファイルの末尾で书いて、具体的な需要を见て、もし间隔が短すぎるならば、カバーすることを提案します.
スクリプトを書きますsh
nohup node myWorkingProcess.js > log_myWorkingProcess.log 2>&1 &

スクリプトを引くのは簡単です.あなたが普段プログラムを起動するときの文です.ここではnohup+&を使ってプログラムをバックグラウンドで実行し、プログラムの出力ログファイルを作成し、logをmyWorkingProcessに出力することを指定します.log,2>&1標準エラーを標準出力にリダイレクトします.すなわち、エラーログでも通常ログでも同じファイルに出力します.
モニタスクリプトを実行してモニタリングを開始できます.
nohup sh ./monitor.sh &

ここで私は同じようにnohup+&,&を使用してスクリプトをバックグラウンドで実行し、端末で他のコマンド操作をすることに影響を与えないようにします.nohupは私が端末を閉じた後もスクリプトが実行されることを保証するためです.そうしないと、私が端末を閉じたときにスクリプトも終了します.
「$'r':command not found」エラーが発生した場合、スクリプトをwinで記述し、winの各行の末尾がrであるのに対し、Unixの行尾フラグは、ここのrは文字だと思っているが、認識していないため、エラーを報告する.この場合dos 2 unixツールで処理すればいいです.
dos2unix monitor.sh
dos2unix run.sh

再稼働すればエラーは発生しません.
ログファイルに行ってみると、すでにログがあります.手動でモニタリングのプロセスをkillして、自動的に引き揚げるかどうかを確認することもできます.
作者のトップページを見る
References: https://www.chenyudong.com/archives/bash-shell-watch-dog-auto-restart-process.html https://blog.csdn.net/xiaojun111111/article/details/82752599 https://blog.csdn.net/xiaojun111111/article/details/82752599