脚本在终端中运行良好,但在 Cron 下运行不佳

脚本在终端中运行良好,但在 Cron 下运行不佳

我在终端中运行此脚本并获得所需的结果,但是当我设置每 5 分钟cron运行一次时/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 运行时,即使 if 语句为 true,$To 变量中的所有收件人都不会收到任何警报,但当它在终端中运行时,每个人都会收到一封电子邮件。

  2. 我尝试将所有电子邮件 ID 直接粘贴到这样的“To:”字段中,因为我认为它没有读取 $To 变量。收件人:someone@somedomain 而不是 $To

但仍然没有一个收件人收到任何警报,并且似乎没有执行任何操作。

答案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.我以 root 身份在 crontab 中使用的条目:

@hourly /root/monitor.sh

与邮件递送相关的问题sendmail或(失败的)邮件递送可以检查/var/log/maillog

答案2

看来shell命令需要写绝对路径,所以sendmail应该是/usr/bin/sendmail。我更新了它并且 cron 开始工作。

相关内容