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。コマンドが実行されたら、このログファイルを確認してください。

おすすめ記事