Nagiosサービスの状態を継続的に監視するためのシェルスクリプトを作成しました(参照:これ質問は次のとおりです。
#!/bin/bash
RCPT="[email protected]"
service nagios status | grep [0-9]
if [ $? -eq 0 ]
then
exit 0
else
service nagios start
echo "Hello, Nagios Service has been started, please confirm." | mail -s "Nagios Service Stopped" $RCPT
fi
コマンドラインから上記のスクリプトを実行すると、期待どおりに機能します。サービスステータス出力でPIDが見つからない場合はEメールを送信し、それ以外の場合は終了します。ただし、このスクリプトをに追加するcrontab
と、実行されるたびに通知が表示されます。
何が問題であり、どのように克服できますか?
答え1
デフォルトでは、非常にcron
制限されたコマンドセットが実行され、PATH
これにはあなたのコマンドは含まれませんservice
。これにより、電子メールが送信されるようにするゼロ以外の戻りコードが生成される可能性があります。
ファイルで特に指定しない限り、コマンドcrontab
は次のパスで実行されます。
PATH=/usr/bin:/bin
対照的に、通常、service
デフォルトusr/sbin
値は次のとおりですPATH
。
# type service
service is /usr/sbin/service
2つの一般的な解決策があります。
PATH
スクリプトの上部付近に必要な内容を記載してくださいcrontab
。すべてのパスを明示的に指定します。
前者はより便利です。後者はより安全であると考えられる。
crontabコマンドをデバッグする方法
電子メールシステムが正しく設定されているシステムでは、cron
cronジョブにエラーが発生するたびにスクリプト出力を含む電子メールがユーザーに送信されます。ただし、すべてのシステムに電子メールが正しく設定されているわけではありません。 cron
エラー通知もロガーに送信されますが、ロガーのエラー処理はロガーの構成によって異なり、これは不透明になる可能性があります。
このような場合は、cronコマンドの実行中にすべてのエラーメッセージを直接収集しますが、crontab行を変更してください。次のようなものを使用してください。
1 2 * * * /path/to/myscript >>/tmp/myscript.log 2>&1
これにより、stdoutとstderrがログファイルにリダイレクトされます/tmp/myscript.log
。コマンドが実行されたら、このログファイルを確認してください。
答え2
出力を次にリダイレクトできます/dev/null
(私はThunderbirdアプリでこれを行います)。
30 05 * * * /usr/bin/thunderbird >/dev/null 2>&1
>>
または、追加の操作を使用してファイルにリダイレクトします。
30 05 * * * /usr/bin/thunderbird >>/tmp/mycron.log 2>&1
メモ:/etc/init.d/NetworkManager status
代わりに、サービスファイルのフルパス(たとえば)を使用できますservice NetworkManager status
。
おすすめ:
とコマンドの組み合わせを使用してpidof
ソフトウェアを観察するのが最善ですps -p
。サービスファイルが/var/run/
ディレクトリのpidファイルをチェックし、プログラムが誤って終了した場合(たとえば、Signal 9)、そのpidファイルが存在するためです。ただし、スマートサービスファイルはstatus
機能的にこれらの状況を確認します。
たとえば、
while :; do
pid=$(pidof SOFTWARE)
watch=$(ps -p ${pid} >/dev/null 2>&1 && echo $?)
[[ ${watch} -ne 0 ]] && service SOFTWARE restart
sleep 3
done