/etc/cluster.cfファイルを常に参照するウォッチドッグプロセス(Linuxバージョン5.xで実行されます)を作成する必要があります
そして、プロセスが文字列と一致する場合:cluster.cfファイルのmachineA_is_active
次に、このプロセスは他のスクリプトを実行します
私の質問は、Linuxが稼働している間は常にプロセスが稼働するように、このプロセスを実行する方法です。
このプロセスがダウンした場合は、このプロセスを再度起動する必要があります
では、このシナリオの基本構造についてアドバイスしてください。
(実例があれば嬉しいです)
これを行うために、プロセスを常に実行し続けることはお勧めしません。もっと簡単な方法があります。マシンでは、定期的なタスクスケジューラであるcronが実行されている必要があります。 1分に1回の頻度で定期的に実行するプロセスをスケジュールして、ファイルの内容を確認し、必要な処理を実行できます。次のようなものをcrontabに追加できます。
* * * * * /path/to/yourscript
見る man 1 crontab
およびman 5 crontab
およびman 8 cron
cronの詳細については。
さらに良いのは、このファイルが変更されたときに実行するプロセスを指定できるincronを使用することです。 incronをインストールしている場合は、次のようなものをincrontabに追加します。
/etc/cluster.cf IN_MODIFY /path/to/your/script
/etc/cluster.cfが変更されたときはいつでも、スクリプトを実行します。見る man 5 incrontab
およびman 1 incrontab
SysVディストリビューションを使用していると仮定して、初期化スクリプトを作成し、それを/etc/init.dに配置します。
このスクリプトをフォーマットする方法の例については、すでに存在するスクリプトのいずれかを参照してください。デーモン機能を使用するものを検討してください。次に、chkconfig
を使用して、起動時にスクリプトを実行できるようにします。この初期化スクリプトは、そのPIDをロックファイルに書き込む必要があります。ロックファイルを読み取って最初のPIDをチェックし、それが実行されているかどうかを判断するには、2番目の「ヘルパープロセス」が必要になります。ロックを破棄し、実行中のPIDが見つからない場合は最初のプロセスを再開するロジックを含めます。
他のものを(再)開始することが唯一の仕事であるものがあり、その名前は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
ウォッチドッグの非常に単純な解決策(最も洗練されたものではありません)は、別のサービスのステータスをチェックするサービスを実行する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