LINUX.ORG.RU

Не отправляется email

 , , ,


0

3

Здравствуйте. Я сам не являюсь специалист по Linux, но, по воле случая, мне пришлось столкнуться с автоматизацией резервного копирования своего сайта, расположенного на сервере под Ubuntu (не ругайтесь, если я запутаюсь в терминологии). И у меня возникла вот такая непонятная проблема. Я создал два скрипта под Bash:

#!/bin/bash

# Создание резервной копии базы данных (дамп) #
 export SEND_MAIL="myEmail@mail.ru"		  # адрес почты отправки отчета
 export DIR_BACKUP="/root/backups/web"                    # Директорий резервных копий
 export DIR_NOW_DATE=backup_`date +%y_%m_%d`              # директорий с текущей датой
 export FILE_NAME=dox-club-`date +%y-%m-%d-%H-%M-%S`.sql  # имя текущего файла
 export DB_USER="user"                          
 export DB_PASSWD="password"                      

 # Создание директория с текущей датой, где будут созданы бекапы #
 mkdir -m 0600 -p $DIR_BACKUP/$DIR_NOW_DATE

  # Создание резервной копии базы данных (дамп) #
 mysqldump --user=$DB_USER --password=$DB_PASSWD -R base-name >$DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME

 # Отчет по электронной почте о сформированном фале #
 ls -lh $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME | mail -s "Отчет об архивировании дампа SQL" $SEND_MAIL
 
exit 0

и второй скрипт:

#!/bin/bash
 
 export SEND_MAIL="myEmail@mail.ru"		 # адрес почты отправки отчета
 export DIR_WEB="/var/www"				 # директорий расположения сайта
 export DIR_BACKUP="/root/backups/web"			 # Директорий резервных копий
 export DIR_NOW_DATE=backup_`date +%y_%m_%d` 		 # директорий с текущей датой
 export FILE_NAME=dox-club-`date +%y-%m-%d-%H-%M-%S`.gz  # имя текущего файла
 
 # Создание директория с текущей датой, где будут созданы бекапы #
 mkdir -m 0600 -p $DIR_BACKUP/$DIR_NOW_DATE

 # Создание архивной копии #
 tar -cPzf $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME -X exclude.txt $DIR_WEB

 # Отчет по электронной почте о сформированном фале #
 ls -lh $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME | mail -s "Отчет об архивировании WEB директория" $SEND_MAIL

 exit 0

Оба скрипта в принципе выполняют свою функцию резервного копирования, в первом случае базы данных, во втором случае директориев и файлов. Но в первом скрипте отчет по электронной почте приходит, а во втором случае, нет. Причем если во втором скрипте в качестве отправки электронной почты не делать вывод списка каталогов (ls), а просто отправить сообщение, то письмо приходит, но если пытаюсь отправить информацию о файле через команду ls, то почта не отправляется. Помогите пожалуйста, в чем может быть проблема, и как ее решить.

А gz создается? Может, у тебя просто отсутствует exclude.txt?

Deleted ()
Ответ на: комментарий от Deleted

Создается. И exclude.txt есть, и каталоги прописанные в файле exclude.txt в архив не попадают. Больше складывается впечатление, что на архивирование нужно время, и пока происходит архивирование, команда ls в директории, в котором создатся файл gz, не может или не успевает выполниться, и при этом ничего не передает в mail, и поэтому не срабатывает отправка почты. Если изменить в скрипте директорий на другой, то нормально приходит по почте список файлов и директориев выбранного каталога. Ну, это мне так кажется. И если это даже так, то я все равно не нашел способ обойти эту проблему.

paradox81ru ()
Ответ на: комментарий от paradox81ru

Включи вывод отладочной информации во втором скрипте:

после #!/bin/bash запиши set -x и запусти скрипт еще раз, будет лучше видно в чем проблема.

anonymous ()
Ответ на: комментарий от anonymous

Включил вывод отладочной информации, и вот результат:

+ export SEND_MAIL=myemail@mail.ru
+ SEND_MAIL=myemail@mail.ru
+ export DIR_WEB=/var/www
+ DIR_WEB=/var/www
+ export DIR_BACKUP=/root/backups/web
+ DIR_BACKUP=/root/backups/web
++ date +%y_%m_%d
+ export DIR_NOW_DATE=backup_15_12_28
+ DIR_NOW_DATE=backup_15_12_28
++ date +%y-%m-%d-%H-%M-%S
+ export FILE_NAME=my-site-15-12-28-07-09-58.gz
+ FILE_NAME=my-site-15-12-28-07-09-58.gz
+ mkdir -m 0600 -p /root/backups/web/backup_15_12_28
+ tar -cPzf /root/backups/web/backup_15_12_28/my-site-15-12-28-07-09-58.gz -X exclude.txt /var/www
+ mail -s 'Отчет об архивировании WEB директория' myemail@email.ru
+ ls -lh /root/backups/web/backup_15_12_28/my-site-15-12-28-07-09-58.gz
+ exit 0
Вроде ничего подозрительного

paradox81ru ()
Ответ на: комментарий от anonymous

Я немного изменил скрипт:

#!/bin/bash
 set -x
 export SEND_MAIL="myemail@yandex.ru"        # адрес почты отправки отчета
 export DIR_WEB="/var/www"               # директорий расположения сайта
 export DIR_BACKUP="/root/backups/web"           # Директорий резервных копий
 export DIR_NOW_DATE=backup_`date +%y_%m_%d`         # директорий с текущей датой
 export FILE_NAME=my-site-`date +%y-%m-%d-%H-%M-%S`.gz  # имя текущего файла
 
 # Создание директория с текущей датой, где будут созданы бекапы #
 mkdir -m 0600 -p $DIR_BACKUP/$DIR_NOW_DATE
 
 # Создание архивной копии #
 tar -cPzf $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME -X exclude.txt $DIR_WEB
 
 # Отчет по электронной почте о сформированных фалах #
 ls -lh $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME | mail -s "Отчет об архивировании WEB директория" $SEND_MAIL
 ls -lh $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME
 echo "TEST EMAIL" | mail -s "Отчет об архивировании WEB директория" $SEND_MAIL
 
 exit 0
И в результате, почта с отчетом о созданном файле как не приходила, так и не приходит. Но информация на консоле о созданном файле появляется, то есть команда ls работает:
-rw-r--r-- 1 root root 12M Dec 28 07:29 /root/backups/web/backup_15_12_28/my-site-15-12-28-07-29-25.gz
и почтовое сообщение с текстом «TEST EMAIL» приходит, то есть и почта в принципе работает.

А вот результат этого скрипта с отладкой:

+ export SEND_MAIL=myemail@mail.ru
+ SEND_MAIL=myemail@mail.ru
+ export DIR_WEB=/var/www
+ DIR_WEB=/var/www
+ export DIR_BACKUP=/root/backups/web
+ DIR_BACKUP=/root/backups/web
++ date +%y_%m_%d
+ export DIR_NOW_DATE=backup_15_12_28
+ DIR_NOW_DATE=backup_15_12_28
++ date +%y-%m-%d-%H-%M-%S
+ export FILE_NAME=my-site-15-12-28-07-29-25.gz
+ FILE_NAME=my-site-15-12-28-07-29-25.gz
+ mkdir -m 0600 -p /root/backups/web/backup_15_12_28
+ tar -cPzf /root/backups/web/backup_15_12_28/my-site-15-12-28-07-29-25.gz -X exclude.txt /var/www
+ mail -s 'Отчет об архивировании WEB директория' myemail@mail.ru
+ ls -lh /root/backups/web/backup_15_12_28/my-site-15-12-28-07-29-25.gz
+ ls -lh /root/backups/web/backup_15_12_28/dox-club-15-12-28-07-29-25.gz
+ mail -s 'Отчет об архивировании WEB директория' myemail@mail.ru
+ echo 'TEST EMAIL'
-rw-r--r-- 1 root root 12M Dec 28 07:29 /root/backups/web/backup_15_12_28/dox-club-15-12-28-07-29-25.gz
+ exit 0

paradox81ru ()
Ответ на: комментарий от paradox81ru

dox-club, если что, название моего сайта, пытался заменить его на my-site, но запутался. Поэтому в скрипте и стоит где-то my-site, а где то dox-club. Это просто ошибки замены

paradox81ru ()
Ответ на: комментарий от paradox81ru

export для переменных здесь не нужен, если они не используются в других скриптах.

DIR_BACKUP="/root/backups/web"

- вот этого лучше не делать, не следует ничего хранить в /root иначе вам скрипт придется запускать с правами root.

посмотрите лог-файлы вашего почтового сервера

foxy_ant ()
Ответ на: комментарий от foxy_ant

Я захожу на сервер через WinSCP, и мне собственно только и дали права root. А как сделать себе отдельного пользователя я не знаю, и экспериментировать не очень-то хочется, чтобы случайно не снести чего либо, я не специалист в ОС Linux. Я просто стараюсь особо ничего не изменять, что может потенциально нарушить работу системы. А что касается скриптов, то я все равно хочу их скинуть в cron.daily, чтобы они автоматически каждый день делали архивирование. Пока правда они не срабатывают там, либо действительно права оставил на скрипты root-овские и cron-у прав на их запуск не хватает, или cron по какой-то причине не запущен, или еще что-то, пока не знаю. Может я вообще не правильно понял систему автозапуска скриптов crontab. Скрипты в ручную пока что запускаю. Но надеюсь, что как-нибудь решу эту проблему. Что касается логов на почтовый сервер, то они, как я понимаю, находятся в файле /var/log/mail.log. Там никаких логов нет, файл пустой. А EXPORT я из скриптов уберу, спасибо большое за рекомендации.

paradox81ru ()
Ответ на: комментарий от paradox81ru

А как сделать себе отдельного пользователя я не знаю

обычный пользователь в системе наверняка уже есть, директории в /home обычно соответствуют именам обычных пользователей

экспериментировать не очень-то хочется, чтобы случайно не снести чего либо

наоборот, работая под root'ом шансов убить систему намного больше

хочу их скинуть в cron.daily

проще их внести в расписание с помощью crontab -e

находятся в файле /var/log/mail.log

необязательно, если используется майлер exim, то логи он пишет в /var/log/exim4/mainlog

foxy_ant ()

Не в тему, но по теме. «Отчет об архивировании ...» надо написать латиницей. Либо транслит, либо base64, либо quoted-printable. 8-битные символы в заголовке недопустимы (если последние rfc не смотреть, про локализацию), так что на это могут реагировать спам-фильтры, к примеру. Первое сообщение баллов не добирает, а во втором это может быть последней каплей. Это как вариант, я не знаю, как mail.ru спам фильтрует.

По теме. Смотреть почтовый лог на предмет ушло сообщение, или не ушло. Стандартный файл - /var/log/maillog. Если, как тут писали, что-то пишет не сюда, то это должно быть всё равно, и быть симлинком, очевидно.

AS ★★★★★ ()

Причем если во втором скрипте в качестве отправки электронной почты не делать вывод списка каталогов (ls), а просто отправить сообщение, то письмо приходит, но если пытаюсь отправить информацию о файле через команду ls, то почта не отправляется.

А если прицепить выхлоп команды вложением?
Может, ему в теле письма не нравятся какие-нибудь символы.

ArcFi ()
Ответ на: комментарий от ArcFi

действительно, лучше записать со скобками:

ls -lh "$DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME"
может быть это избавит о проблем непереносимости некоторых символов.

foxy_ant ()
Ответ на: комментарий от foxy_ant

Я конечно очень извиняюсь, но отчет по электронной почте по первому скрипту стал приходить. Я честное слово даже не знаю почему. Я конечно код постоянно менял, может что-то в нем в конечном счете случайно и исправил, но вот что, не знаю. Хотя мне кажется это действительно какие-то были проблемы mail.ru, что-то они похоже спамили. Ради интереса приведу рабочий код скрипта:

#!/bin/bash

 SEND_MAIL="paradox81ru@yandex.ru"		 # адрес почты отправки отчета
 DIR_WEB="/var/www"				 # директорий расположения сайта
 DIR_BACKUP="/root/backups/web"			 # Директорий резервных копий
 DIR_NOW_DATE=backup_`date +%y_%m_%d` 		 # директорий с текущей датой
 FILE_NAME=dox-club-`date +%y-%m-%d-%H-%M-%S`.gz  # имя текущего файла
 
 # Создание директория с текущей датой, где будут созданы бекапы #
 mkdir -m 0600 -p $DIR_BACKUP/$DIR_NOW_DATE

 # Создание архивной копии #
 tar -cPzf $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME -X exclude.txt $DIR_WEB

 # Отчет по электронной почте о сформированных фалах #
 ls -lh $DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME | mail -s "Отчет об архивировании WEB директория" $SEND_MAIL


 exit 0
paradox81ru ()
Ответ на: комментарий от paradox81ru

Кстати передавать по электронной почте стало после того как я попробовал заключил в кавычки путь к файл

ls -lh "$DIR_BACKUP/$DIR_NOW_DATE/$FILE_NAME"


А после продолжило передавать и после того как я эти кавычки убрал. Сейчас все работает,спасибо всем большое.
paradox81ru ()
Ответ на: комментарий от foxy_ant

В директории home пусто, я его сразу проверил, наверное все таки никаких других пользователей не создано.

Согласен конечно, что под root-ом убить систему очень легко, поэтому и стараюсь делать изменения очень аккуратно, только если точно знаю, что это не убьет систему. Наверное я попрошу все таки админа, который VPS создавал, чтобы он мне пользователя попроще создал.

crontab -e через удаленную терминальную консоль у меня выдает ошибку, что-то вроде, что не может через эту консоль запустить редактор vim. Поэтому я и пытаюсь через уже созданные и вроде бы настроенные cron-ом директории (cron.daily) запускать скрипт. Если скинуть в этот директорий скрипт, то он ведь должен запускаться? В crontab эти директории по крайней мере упоминаются

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
12 * * * * root cd / && run-parts --report /etc/cron.hourly
52 3 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
29 3 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
7 0 23 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

paradox81ru ()
Ответ на: комментарий от paradox81ru

В директории home пусто.

в man-странице adduser хорошее описание как создать обычного пользователя

стараюсь делать изменения очень аккуратно

Это не спасает от ошибок, к сожалению. Как не бывает программистов которым пишут сразу и без отладки, так, наверное, не бывает сисадминов которые не пожалели о нелепых ошибках сделанных из под root'а

crontab -e через удаленную терминальную консоль у меня выдает ошибку

В какой терминальной программе, как она называется?

Если скинуть в этот директорий скрипт, то он ведь должен запускаться?

Не будет, cron устроен сложнее, одного добавление файла или одной правки в редакторе файлов расписаний недостаточно.

foxy_ant ()
Ответ на: комментарий от foxy_ant

Я работаю с WEB-сервером через WinSCP. После запуска команды crontab -e в консоле, появляется сообщение:

vim warning: Output is not to a terminal
vim warning: Input is not from a terminal
после чего связь с удаленным сервером теряется.

paradox81ru ()
Ответ на: комментарий от foxy_ant

Да, через PuTTY похоже можно добавить задние в cron. Осталось только разобраться как работать с VIM и как добавлять задания. Спасибо большое всем за помощь. Foxy_ant, спасибо за рекомендации. Буду дальше читать и разбираться.

paradox81ru ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.