Cron 作业发送空邮件

Cron 作业发送空邮件

我编写了一个 shell 脚本,用于检查所有服务器上的 NTP 服务并将输出邮寄到特定电子邮件。当我手动执行它时,它运行良好并且我收到包含有效内容的电子邮件。

但是,当我将其放入同一用户的 cronjob 中时,它会发送空邮件。 cronjob运行时发现该文件/tmp/ntp_status.txt没有存储任何信息。但它会在手动运行时更新详细信息。我无法找出缺少什么。即使我为 root 用户安排了 cronjob,同样的问题仍然存在。下面是我的脚本和 crontab 条目。

0 12 * * * /root/test/servers_list/ntp.test.sh

#!/bin/bash
USR="root"

# Email
SUBJECT="NTP Service Status Report"
EMAIL="[email protected]"
EMAILMESSAGE="/tmp/ntp_status.txt"

# create new file
>$EMAILMESSAGE

# connect each host and pull up user listing
for host in `cat SAP_Prod_servers_51`
do
echo "--------------------------------" >>$EMAILMESSAGE
echo "* HOST: $host " >>$EMAILMESSAGE
echo "--------------------------------" >>$EMAILMESSAGE
ssh $USR@$host "UP=$(ps -ef | grep -v grep | grep ntpd | wc -l);
if [ "$UP" -ne 1 ];
then
        echo "NTP is down.";
        sudo service ntpd start

else
        echo "NTP Service is running.";
fi" >> $EMAILMESSAGE
done

# send an email using /bin/mail
/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

答案1

我不确定这是否可行。因为 ssh 参数(命令)的第一个双引号的结束对结束时 if [] 内部没有任何转义。这同样适用于那里的回声。

我稍微简化了脚本。但没有测试过。

#!/bin/bash
USR="root"
FILE=/full/path/to/file/change/this/SAP_Prod_servers_51

# Email
SUBJECT="NTP Service Status Report"
EMAIL="[email protected]"

for host in $(cat "$FILE")
do
  echo "--------------------------------"
  echo "* HOST: $host "
  echo "--------------------------------"
  ssh $USR@$host "
    if pgrep ntpd >/dev/null
    then
      echo 'NTP Service is running.'
    else
        echo 'NTP is down.'
        sudo service ntpd start
    fi
  " 2>&1
done | /bin/mail -s "$SUBJECT" "$EMAIL"

注意:请记住,运行 ntpd 并不意味着您的时间将正确同步。

如果这些服务器具有systemd,则systemd有能力启动失败的服务。

还要考虑:

  • 实施监测和测量 ntp 偏移量。将其绘制成图表并根据某些阈值触发通知,

  • 使用配置管理软件来保证服务状态。

相关内容