我有一个 BASH 脚本,它可以“读取”备份日志,报告上次备份的成功/失败,列出备份目录的内容,然后通过电子邮件发送结果。将备份移动到新服务器并将电子邮件例程转换为函数后,它会向我发送电子邮件。看起来它正在扩展日期并为每个扩展到的日期发送一封电子邮件。我怎么也看不出怎么做。以下是“MAIN”中的一些代码:
YDATE=$(date -s "yesterday" '+%a%b%d')
BKPLOG="/mnt/nfs/horizon/backuplog_$YDATE.log"
STATUS=$(cat /mnt/nfs/horizon/backuplog_$YDATE.log)
# Catenate logs and status into message body -- email report to
# Support.
func_make_msg $MSG "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send $MSG "[email protected]" # Send it!
func_make_message 只是创建消息。请注意,这两个函数都不在 for 或 while 循环中。以下是发送函数:
function func_send ()
{
local _message=$1
local _cc=$2
local _recipient=$3
$PRINT --columns=2 -t < $_message | $MAIL -s "Backup Logs" "$_cc"
}
每次运行我的收件箱时,都会显示备份日志中每个日期的电子邮件。幸好我把旧的都抹掉了,否则我的收件箱还是会很乱。
备份服务器是 Debian。脚本在 cron 作业上运行:
0 7 * * * bash /home/bkpadmin/scripts/backup_mail.sh
有什么想法吗?时间差了一大截,但我通过手动运行消除了 ntp、cron 因素。即使在修复时间/日期并手动运行后,我也会得到相同的结果。
对于好奇的人来说,这是 func_make_msg 函数:
function func_make_msg ()
{
local _msg_body=$1
local _file=$2
local _backup_status=$3
local _db_backups=$4
cat > $_msg_body << EOM
## Nightly backup logs ###########################
** Backup Status **
File name: $_file
$_backup_status
---------------
** Important DB Server ****
$_db_backups
---------------
EOM
}
谢谢〜
布布诺夫
更新谢谢 Dennis。就是这样。我犯了一个非常愚蠢的错误。由此产生的类似循环的结果很有趣。我真是愚蠢至极,因为我实际上阅读了手册页来提醒自己如何计算“昨天”。将“s”替换为“d”。我猜“S”是“string”中的“S”。……要了解更多愚蠢之处……请继续阅读……
在测试期间没有发生这种情况,因为该脚本属于普通用户帐户,并且是在普通用户帐户中运行的。date -s 命令失败,但昨天仍然输出...只是没有设置系统日期...缺乏权限等等。指出我的第二个...甚至更愚蠢的错误...cron 条目是针对 root 的。另一个例子说明了为什么除非没有其他办法,否则永远不应该以 root 身份运行脚本,甚至不应该以 root 身份登录。
由于拥有 rootly 的权力,该脚本能够更改系统日期,并且由于变量被反复扩展而导致严重问题。我正在向有关当局自首。对不起,世界。
当我们讨论这个话题时,有人能发现其他愚蠢的错误吗?
答案1
我的第一个建议是引用$MSG
以下几行:
func_make_msg "$MSG" "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send "$MSG" "[email protected]" # Send it!
在$_message
这一行
$PRINT --columns=2 -t < "$_message" | $MAIL -s "Backup Logs" "$_cc"
但我认为那些是文件名,并且它们不是问题的根源。
您可以消除cat
此行:
STATUS=$(< /mnt/nfs/horizon/backuplog_$YDATE.log)
但再说一遍,这不是你的真正问题。
编辑:
我想我找到你的问题了:date -s
套日期和时间。尝试删除-s
。