web-dev-qa-db-ja.com

プロセスが実行されているかどうかを確認し、結果に基づいて動作するLinuxスクリプト

定期的に失敗するプロセスがあり、重複インスタンスを開始することがあります。

実行すると:_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")

可能なら。

32
linuxnoob

システム上のプロセスが実行されているかどうかを監視するプログラム。

スクリプトは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

66
Jotne

@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
8
Tirias

私の状況に合わせてスクリプトを採用しました。

#! /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するより良い方法がありますか?ダウンタイムはゼロになるでしょうか?

4
linuxnoob

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

参考までに

0
Kris Long