cronに追加するときのシェルスクリプトの問題

cronに追加するときのシェルスクリプトの問題

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つの一般的な解決策があります。

  1. PATHスクリプトの上部付近に必要な内容を記載してくださいcrontab

  2. すべてのパスを明示的に指定します。

前者はより便利です。後者はより安全であると考えられる。

crontabコマンドをデバッグする方法

電子メールシステムが正しく設定されているシステムでは、croncronジョブにエラーが発生するたびにスクリプト出力を含む電子メールがユーザーに送信されます。ただし、すべてのシステムに電子メールが正しく設定されているわけではありません。 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

関連情報