我编写了一个 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 偏移量。将其绘制成图表并根据某些阈值触发通知,
使用配置管理软件来保证服务状态。