GNU/Linux >> Linux の 問題 >  >> Linux

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

私はあなたのスクリプトを私の状況 Jotne に採用しました。

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


<ブロック引用>

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

スクリプトは crontab に格納されます 毎分実行されます。

これは、プロセスが実行されていないか、プロセスが複数回実行されている場合に機能します:

#! /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 &

これを crontab で使用して、次のように毎分実行できます:

* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &

cccamオスカム


@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

Linux
  1. Linuxで実行中のサービスを確認する

  2. シェル スクリプトが実行されているかどうかを確認する Linux コマンド

  3. プロセスの pid を取得し、シェル スクリプトで kill -9 を呼び出す方法は?

  1. OSとLinuxのバージョンを確認する方法

  2. Ls *、Ls**およびLs***の結果?

  3. init プロセスを Linux のシェル スクリプトにすることはできますか?

  1. Linux –実行中のプロセスの壁掛け時計の時間を取得する方法は?

  2. LinuxでPythonを使用してプロセスがまだ実行されているかどうかを確認するには?

  3. Linux で特定のプロセスのオープン FD 制限を確認する