Crontabが実行しているスクリプトからEメールを送信する

Crontabが実行しているスクリプトからEメールを送信する
#!/BIN/BASH
# To alert whenever lsof crosses 80%

maxlimit=32000
echo 'Max limit is ' $maxlimit
tlimit=$(bc <<< $maxlimit*0.8)
echo 'Treshold limit at 80% ' $tlimit
a=$(lsof | wc -l)
echo 'Current usage ' $a
if [ $(bc <<< "$a > $tlimit") -eq 1 ]
then
        echo 'lsof =' $a 'has exceeded 80% of maximum limit' | /usr/bin/Mail -s "ALERT!!!" "*****@cisco.com"
fi

* * * * * bash /root/vasanth/lsef/script.sh

上記のスクリプトでは、出力は対応するメールIDでEメールを送信します。

手動で実行するとメールが送信されます。

ただし、cronに予約されている場合、メールは送信されません。

何が問題なのかわかりません。どのようにデバッグできますか?

答え1

このようなcron操作の主な問題は、簡単にデバッグできないことです。

通常、cronジョブは自動的に機能するはずです。エラーがない場合ただし、エラーが発生した場合は非常に詳細に説明する必要があります。

EgorVasilevの答えを拡張すると、次のコマンドを使用してbashスクリプトで「デバッグモード」を簡単にオンにできます。

#!/bin/bash -x
exec 2>>/var/log/cron.log

注文する。最初はflagsを通してスクリプトを解釈します-x。つまり、実行されたすべてのコマンドをstderrにインポートします。

exec 2>>/var/log/cron.logコマンドとは何ですか?何もしないでください、代わりに追加モードで標準エラーをログファイルにリダイレクトします。本質的に、シェルインタプリタは、所与のリダイレクトを使用してそれ自体「再実行」される。スクリプト実行コンテキストを変更する必要もありません。

答え2

1.まず:#!/bin/bash代わりに使用#!/BIN/BASH

#!/BIN/BASH次のスクリプトを実行すると:

bash script.sh

..すべてが正常です。

しかし、以下を実行すると:

./script.sh

..エラーが発生します:

-bash: ./script.sh: /BIN/BASH: bad interpreter: No such file or directory

2.次のコマンドを実行します。

echo 'PATH='$PATH

スクリプトの先頭に出力を追加します。

はい:

# echo 'PATH='$PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

関連情報