これが取引です:私は桟橋で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
を実行する方が良いでしょうか?すでに実行されている場合は、すでに実行されている応答を取得するためです。
Monitのようなものを考えたことがありますか? cronジョブよりもはるかに高速に応答し、通知をメールで送信します。ヘルスチェックを指定して、アプリが正しく機能していることを確認できます。
ターミナルからこの方法を試してください。動作している場合は、crontabに入れます。
echo "PASSWORD" | Sudo -S service jetty status && echo "Jetty is running" || Sudo service jetty start
ご参考までに :
||
は論理的なOR
を意味し、&&
は論理的なAND
を意味します
2>&1
は、STDERR
をSTDOUT
にリダイレクトすることを意味します
0
は、ほぼすべてのプログラムのGOOD
終了ステータスです(ほとんどのプログラマーはそのようにプログラミングしています)。したがって、service jetty status
がエラーなしで終了している場合は、Jetty is
をエコーするだけです。それ以外の場合は、サービスを開始します。
running
Sudo -S
--manページから:-"-S(stdin)オプションを使用すると、Sudoは端末デバイスではなく標準入力からパスワードを読み取ります。パスワードの後には新行文字を続ける必要があります。"
Crontabでサービスを作成する代わりに、小さなデーモンを追加して、サービスが実行されているかどうかを確認し、実行されていないときにリロードすることができます。 Sukuのチェック条件を使用して、次のような小さなデーモンをスクリプト化できます。
#!/bin/sh
reloader() {
while :
do
sleep 5
service httpd jetty || Sudo service jetty start
done
}
reloader &
このスクリプトは、サービスが実行されているかどうかを5秒ごとにチェックし、CPUをあまり消費しません。これは、crontabでのジョブよりも正確です。
スクリプト自体にクリアテキストとしてパスワードを設定する代わりに、このスクリプトをrootとして実行すると、より安全で効率が低下することはありません。
プロセス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 を参照してください。
あなたがあなたの質問で言ったように、あなたはあなたのサービスを止める理由を調査する必要があります。
とにかく、 monit を試すことができます。これは、サービスを監視し、必要に応じて再起動するように構成できるデーモンです。したがって、このためのスクリプトを作成する必要はありません。また、ロギングは、サービスがいつ停止および再開されたかを知るのに役立ちます。
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