У меня есть сценарий 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 "fake@admin.org" # 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
}
Спасибо ~
Бубнофф
ОБНОВИТЬ Спасибо, Деннис. Вот и все. Глупая, глупая ошибка с моей стороны. Полученные результаты в виде петли интересны. Я дважды дурак, так как на самом деле читаю страницу руководства, чтобы напомнить себе, как вычислить «вчера». Поменял s на d. «S», как я полагаю, «строка». ... Для большей глупости ... читайте дальше ...
Этого не произошло во время тестирования, потому что скрипт принадлежал и запускался под ... учетной записью обычного пользователя. Команда date -s завершилась неудачно, но все еще выводит вчера ... просто не установила системную дату ... отсутствуют разрешения и все такое. Указывает на мою вторую ... еще более идиотскую ошибку ... запись в cron была для root. Еще один пример того, почему никогда не следует запускать скрипты от имени пользователя root или даже входить в систему как root, если нет другого пути.
Сценарий смог изменить системную дату и дату, и сильно ошибся, поскольку переменная неоднократно расширялась благодаря своим полномочиям root. Пока мы говорим, я сдаюсь соответствующим властям. Прости, мир.
Может ли кто-нибудь увидеть другие глупые ошибки, пока мы говорим об этом?
Моя первая рекомендация - цитировать $MSG
в этих строках:
func_make_msg "$MSG" "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send "$MSG" "fake@admin.org" # Send it!
и $_message
в этой строке
$PRINT --columns=2 -t < "$_message" | $MAIL -s "Backup Logs" "$_cc"
Но я предполагаю, что это имена файлов, и они не являются источником вашей проблемы.
Вы можете устранить cat
в этой строке:
STATUS=$(< /mnt/nfs/horizon/backuplog_$YDATE.log)
Но, опять же, это не ваша настоящая проблема.
Редактировать:
Думаю, я нашел вашу проблему: date -s
наборы дату и время. Попробуйте удалить -s
.