スクリプトは端末ではうまく実行されますが、Cronでは実行されません。

スクリプトは端末ではうまく実行されますが、Cronでは実行されません。

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

質問:

  1. スクリプトがcronを介して実行されると、$ To変数のすべての受信者は、ifステートメントがtrueの場合でも警告を受けませんが、端末で実行すると、誰もが電子メールを受け取ります。

  2. $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.shcrontabがrootとして使用するエントリです。

@hourly /root/monitor.sh

メール転送または(失敗した)メール配信に関する問題をsendmail確認できます/var/log/maillog

答え2

シェルコマンドは絶対パスを作成する必要sendmailがあるようです/usr/bin/sendmail。私はそれを更新し、cronが動作し始めました。

関連情報