cron
ターミナルでこのスクリプトを実行して目的の結果を得ましたが、5分ごとに実行するように設定すると、/root/somefolder/
期待どおりに実行されません。
私のrootユーザーcrontabエントリは次のとおりです。
*/5 * * * * ~root/somedirectory/script.sh
スクリプトは次のとおりです。
#!/bin/bash
## Variables ##
host="`/bin/hostname`";
## Limits ##
OneMin="1";
FiveMin="6";
FifteenMin="6";
## Mail IDs ##
To="someone@somedomain"; Fr="root@"$host;
## Load Averages ##
LA=(`uptime | grep -Eo '[0-9]+\.[0-9]+' | cut -d"." -f1`)
## Top Process List ##
tp=(`ps -ef | sort -nrk 3,3 | grep -E "(php|httpd)" | grep -v root | head -n30 | awk '{print $2}'`)
## Actions ##
if [ ${LA[0]} -ge $OneMin ]; then
## Send Mail ##
echo -e "From: $Fr
To: $To
Subject: *ALERT* - Current Load on '$host' Is High Load Averages Are: \n\n 1:Min\t5:Min\t15:Min \n
${LA[0]}\t${LA[1]}\t${LA[2]} \n\n List Of Processes That Were Killed \n" | sendmail -t
## Kill Top Pocesses ##
for i in $tp ; do kill -9 $i
done
fi
質問:
スクリプトがcronを介して実行されると、$ To変数のすべての受信者は、ifステートメントがtrueの場合でも警告を受けませんが、端末で実行すると、誰もが電子メールを受け取ります。
$To変数を読んでいないと思ったので、すべてのEメールIDをこのように「受信者:」フィールドに直接貼り付けました。受信者:$ Toの代わりにsomeone@somedomain
しかし、まだ受信者のどれも警告を受けておらず、何もしなかったようです。
答え1
sendmail
スクリプトで次の構文を試してください。
#!/bin/bash
# some code
/usr/sbin/sendmail -t <<EOF
To: [email protected] "$address1" "$address2"
Cc: [email protected] [email protected] [email protected]
Subject: [Monitoring] $foo $bar at $host
From: [email protected]
Monitoring for example.com server loss of connectivity - hourly update:
---------------------------------------------------------------------------
$some
$more
$variables
EOF
"heredoc"ブロックに変数を含めることができます。
スクリプト名は、monitor.sh
crontabがrootとして使用するエントリです。
@hourly /root/monitor.sh
メール転送または(失敗した)メール配信に関する問題をsendmail
確認できます/var/log/maillog
。
答え2
シェルコマンドは絶対パスを作成する必要sendmail
があるようです/usr/bin/sendmail
。私はそれを更新し、cronが動作し始めました。