web-dev-qa-db-ja.com

linux +シェルスクリプトで簡単なウォッチドッグプロセスを作成する

/etc/cluster.cfファイルを常に参照するウォッチドッグプロセス(Linuxバージョン5.xで実行されます)を作成する必要があります

そして、プロセスが文字列と一致する場合:cluster.cfファイルのmachineA_is_active

次に、このプロセスは他のスクリプトを実行します

私の質問は、Linuxが稼働している間は常にプロセスが稼働するように、このプロセスを実行する方法です。

このプロセスがダウンした場合は、このプロセスを再度起動する必要があります

では、このシナリオの基本構造についてアドバイスしてください。

(実例があれば嬉しいです)

2
Eytan

これを行うために、プロセスを常に実行し続けることはお勧めしません。もっと簡単な方法があります。マシンでは、定期的なタスクスケジューラであるcronが実行されている必要があります。 1分に1回の頻度で定期的に実行するプロセスをスケジュールして、ファイルの内容を確認し、必要な処理を実行できます。次のようなものをcrontabに追加できます。

* * * * * /path/to/yourscript

見る man 1 crontabおよびman 5 crontabおよびman 8 croncronの詳細については。

さらに良いのは、このファイルが変更されたときに実行するプロセスを指定できるincronを使用することです。 incronをインストールしている場合は、次のようなものをincrontabに追加します。

/etc/cluster.cf IN_MODIFY /path/to/your/script

/etc/cluster.cfが変更されたときはいつでも、スクリプトを実行します。見る man 5 incrontabおよびman 1 incrontab

2
stew

SysVディストリビューションを使用していると仮定して、初期化スクリプトを作成し、それを/etc/init.dに配置します。

このスクリプトをフォーマットする方法の例については、すでに存在するスクリプトのいずれかを参照してください。デーモン機能を使用するものを検討してください。次に、chkconfigを使用して、起動時にスクリプトを実行できるようにします。この初期化スクリプトは、そのPIDをロックファイルに書き込む必要があります。ロックファイルを読み取って最初のPIDをチェックし、それが実行されているかどうかを判断するには、2番目の「ヘルパープロセス」が必要になります。ロックを破棄し、実行中のPIDが見つからない場合は最初のプロセスを再開するロジックを含めます。

1
Aaron Copley

他のものを(再)開始することが唯一の仕事であるものがあり、その名前はinitであり、inittabを介して構成されます。何かを本当に不滅にするには、respawnオプションを指定してinittabに追加します。

単純なチェッカースクリプト(inittabの候補)は次のようになります。

while :
do
     grep -q machineA_is_active /etc/cluster.cf && activation_script
     # here one needs to ensure the above wan't fire again
     # - say, by carelessly wiping off /etc/cluster.cf
     # or carefully editing out the triggering record
     sleep $delay
done
0
yrk

ウォッチドッグの非常に単純な解決策(最も洗練されたものではありません)は、別のサービスのステータスをチェックするサービスを実行するcronジョブを作成することです。

Sudo crontab -e

次に、この行をcrontabファイルの最後に置きます(crontabを再度変更するまで、これは毎日毎分実行されることに注意してください)

* * * * * /usr/sbin/sample_service

次に、CTRL-X、Y、ENTERを押して、マシンを再起動します。

これはそのようなサービスの例です:

    #!/bin/bash
    #
    # watchdog
    #
    # Run as a cron job to keep an eye on what_to_monitor which should always
    # be running. Restart what_to_monitor and send notification as needed.
    #
    # This needs to be run as root or a user that can start system services.
    #
    # Revisions: 0.1 (20100506), 0.2 (20100507)

    NAME=sample_service
    NAME2=sample_service2
    START=/usr/sbin/$NAME
    START2=/usr/sbin/$NAME2
    [email protected]
    [email protected]
    GREP=/bin/grep
    PS=/bin/ps
    NOP=/bin/true
    DATE=/bin/date
    # MAIL=/bin/mail
    RM=/bin/rm

    $PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME is NOT RUNNING. Starting $NAME and sending notices."
     $START 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

     # GT06
    $PS -ef|$GREP -v grep|$GREP $NAME2 >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME2 is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME2 is NOT RUNNING. Starting $NAME2 and sending notices."
     $START2 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME2 was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

    exit
0
tony gil