web-dev-qa-db-ja.com

freebsdは、サービスがアクティブかどうかを確認し、アクティブでない場合はサービスを開始するスクリプトを作成します

これが取引です:私は桟橋でApachesolrを使ってfreebsdウェブサーバーを実行しています

時々(月に数回)桟橋が終了し、次のように入力して再起動する必要があります。

service jetty start

UNIXスクリプトを作成するのは初めてです。確かに、サービスが停止している理由を確認する必要がありますが、簡単な修正のために、サービスがまだ実行されているかどうかを確認するためにcronを30分ごとに実行させてもかまいません。

website で見つけましたが、何をしているのか完全には理解していないので、必要に応じて変更することはできません。

# check rc script supports status
    ${SERVICE} 2>&1 | /usr/bin/grep '|status|poll' >/dev/null
    if [ $? -eq 0 ]
    then
        # check status
        STATUS=$(${SERVICE} status)
        if [ $? -gt 0 ]
        then
            # service not running try to start
            echo ${STATUS}
            ${SERVICE} start
            ${SERVICE} status
        fi
    fi

だからここに私が上記のコードから作ることができるものがあります:

{SERVICE}は変数なので、「servicejetty」に置き換えることができますか?

something gets thrown away :)
if [something -equals 0]
 if something > 0
   starting service
 fi
fi

2>&1はどういう意味/ですか?

または、cronからservice jetty startを実行する方が良いでしょうか?すでに実行されている場合は、すでに実行されている応答を取得するためです。

1
FLY

Monitのようなものを考えたことがありますか? cronジョブよりもはるかに高速に応答し、通知をメールで送信します。ヘルスチェックを指定して、アプリが正しく機能していることを確認できます。

http://mmonit.com/monit/

1
Rasputnik

ターミナルからこの方法を試してください。動作している場合は、crontabに入れます。

echo "PASSWORD" | Sudo -S service jetty status && echo "Jetty is running" || Sudo service jetty start

ご参考までに :

  • ||は論理的なORを意味し、&&は論理的なANDを意味します

  • 2>&1は、STDERRSTDOUTにリダイレクトすることを意味します

  • 0は、ほぼすべてのプログラムのGOOD終了ステータスです(ほとんどのプログラマーはそのようにプログラミングしています)。したがって、service jetty statusがエラーなしで終了している場合は、Jetty is
    running
    をエコーするだけです。それ以外の場合は、サービスを開始します。

  • Sudo -S --manページから:-"-S(stdin)オプションを使用すると、Sudoは端末デバイスではなく標準入力からパスワードを読み取ります。パスワードの後に​​は新行文字を続ける必要があります。"

2
Suku

Crontabでサービスを作成する代わりに、小さなデーモンを追加して、サービスが実行されているかどうかを確認し、実行されていないときにリロードすることができます。 Sukuのチェック条件を使用して、次のような小さなデーモンをスクリプト化できます。

#!/bin/sh

reloader() {
  while :
  do
      sleep 5
      service httpd jetty || Sudo service jetty start
  done
}

reloader &

このスクリプトは、サービスが実行されているかどうかを5秒ごとにチェックし、CPUをあまり消費しません。これは、crontabでのジョブよりも正確です。

スクリプト自体にクリアテキストとしてパスワードを設定する代わりに、このスクリプトをrootとして実行すると、より安全で効率が低下することはありません。

1
philippe

プロセスIDを格納し、はるかに安全な、より包括的なスクリプトを使用します。

#!/bin/bash

processId=$(service jetty start)          # Start yetty
processId=$!      # stores the process ID of jetty

while sleep 30
do
    if kill -0 $processId # Check if process is still running 
    then
        echo >&2 "Process is running." 
    else
        echo >&2 "ERROR - terminated"
   break
    fi
done

スクリプトをcronに入れて、ときどきチェックします。その他の例と優れたチュートリアルについては、@ http://mywiki.wooledge.org/BashFAQ#BashFAQ.2BAC8-042.How_can_I_find_out_if_a_process_is_still_running.3F を参照してください。

0

あなたがあなたの質問で言ったように、あなたはあなたのサービスを止める理由を調査する必要があります。

とにかく、 monit を試すことができます。これは、サービスを監視し、必要に応じて再起動するように構成できるデーモンです。したがって、このためのスクリプトを作成する必要はありません。また、ロギングは、サービスがいつ停止および再開されたかを知るのに役立ちます。

0
Khaled

statusコマンドは、すべてのrc.dスクリプトでサポートされている必要があります。このスクリプトを使用して、デッドデーモンを再起動できます。

. /etc/rc.subr

for service in ${autorestart_services}; do
    /usr/local/etc/rc.d/${service} status >/dev/null
    if [ $? != 0 ]; then
        echo "System service ${service} is down. Try to restart..."
        /usr/local/etc/rc.d/${service} restart
    fi
done
0
citrin