定期的に失敗するプロセスがあり、重複インスタンスを開始することがあります。
実行すると:_ps x |grep -v grep |grep -c "processname"
_取得します:_2
_プロセスが回復プロセスで実行されるため、これは正常です。
_0
_を取得した場合、次の場合にプロセスを開始します:_4
_プロセスを停止して再起動します
私が必要なのは、_ps x |grep -v grep |grep -c "processname"
_の結果を取得する方法です
次に、シンプルな3オプション機能をセットアップします
_ps x |grep -v grep |grep -c "processname"
if answer = 0 (start process & write NOK & Time to log /var/processlog/check)
if answer = 2 (Do nothing & write OK & time to log /var/processlog/check)
if answer = 4 (stot & restart the process & write NOK & Time to log /var/processlog/check)
_
プロセスは_killall -9 process
_で停止しますプロセスは_process -b -c /usr/local/etc
_で開始します
私の主な問題は、_ps x |grep -v grep |grep -c "processname"
_の結果に基づいて行動する方法を見つけることです。
理想的には、そのようなgrepの結果を、次のようなスクリプトでスクリプト内の変数にしたいと思います。
process=$(ps x |grep -v grep |grep -c "processname")
可能なら。
システム上のプロセスが実行されているかどうかを監視するプログラム。
スクリプトはcrontab
に保存され、1分ごとに実行されます。
#! /bin/bash
case "$(pidof amadeus.x86 | wc -w)" in
0) echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
;;
1) # all ok
;;
*) echo "Removed double Amadeus: $(date)" >> /var/log/amadeus.txt
kill $(pidof amadeus.x86 | awk '{print $1}')
;;
esac
0
プロセスが見つからない場合は、再起動します。1
プロセスが見つかった場合、すべて問題ありません。*
プロセスが2つ以上実行されている場合、最後のプロセスを強制終了します。
pidof
プログラムからの終了フラグ$?
をテストするだけです。プロセスの0
が実行され、そうでない場合は1
になります。
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
@Jotneソリューションを採用し、完璧に動作します!たとえば、NASのmongodbサーバーの場合
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac
私の状況に合わせてスクリプトを採用しました。
#! /bin/bash
logfile="/var/oscamlog/oscam1check.log"
case "$(pidof oscam1 | wc -w)" in
0) echo "oscam1 not running, restarting oscam1: $(date)" >> $logfile
/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
;;
2) echo "oscam1 running, all OK: $(date)" >> $logfile
;;
*) echo "multiple instances of oscam1 running. Stopping & restarting oscam1: $(date)" >> $logfile
kill $(pidof oscam1 | awk '{print $1}')
;;
esac
テスト中に問題が発生しました。この行でoscam1の3つの追加プロセスを開始しました:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
oscam1の8つのプロセスが残りました。問題はこれです。スクリプトを実行すると、一度に2つのプロセスのみが強制終了されるため、2つのプロセスに移行するには3回実行する必要があります。
killall -9 oscam1
に続く/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
以外の*)
には、元のプロセスとは別にkillallするより良い方法がありますか?ダウンタイムはゼロになるでしょうか?
Awk '{print $ 1}'を '{$ 1 = ""に変更した場合; print $ 0} '結果として最初のものを除くすべてのプロセスを取得します。フィールド区切り文字(通常はスペース)で始まりますが、killallの思いやりを覚えていません。そう:
#! /bin/bash
logfile="/var/oscamlog/oscam1check.log"
case "$(pidof oscam1 | wc -w)" in
0) echo "oscam1 not running, restarting oscam1: $(date)" >> $logfile
/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
;;
2) echo "oscam1 running, all OK: $(date)" >> $logfile
;;
*) echo "multiple instances of oscam1 running. Stopping & restarting oscam1: $(date)" >> $logfile
kill $(pidof oscam1 | awk '{ $1=""; print $0}')
;;
esac
Pidofルートはスペースのないコマンドに対しては正常に機能するように見えますが、たとえば、myscriptという名前のpythonスクリプトを探している場合は、おそらくpsベースの文字列に戻りたいでしょう。のようなPSの下に現れた
ルート22415 54.0 0.4 89116 79076 pts/1 S 16:40 0:00/usr/bin/python/usr/bin/myscript
参考までに