我在终端中运行此脚本并获得所需的结果,但是当我设置每 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
问题:
当脚本通过 cron 运行时,即使 if 语句为 true,$To 变量中的所有收件人都不会收到任何警报,但当它在终端中运行时,每个人都会收到一封电子邮件。
我尝试将所有电子邮件 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 开始工作。