В предыдущей статье мы сделали скрипт который автоматически снимал дамп базы данных, упаковывал его и отсылал на FTP сервер, сейчас мы добавим к нашему сценарию проверку на доступность сервера. Для этого используем netcat и проверку выполнения условия.
Конструкция будет следующая:
#!/bin/bash
HOST="example.com"
PORT="port_number"
if nc -zw 10 $HOST $PORT
then
echo "Host $HOST avalible, port ${PORT} is up"
else
echo "Host $HOST not avalible, port ${PORT} is down"
fi
Можете проверить работу скрипта.
Разберём его поподробней:
Оператор if проверяет успешность выполнения команды
nc -zw 10 $HOST $PORT
Где nc — вызов NetCat
-z — запрещает посылать пакеты, получается просто сканирование портов
-w — устанавливает таймаут через который прекратится в сканирование, у нас установлен таймаут в 10 секунд, с ним можно поиграть.
Если все нормально, затем (then) следует выполнение одной части скрипта, если что-то не так, то выполняется другая часть скрипта, этим-то мы и воспользуемся коварно :)
В итоге получим такой сценарий:
#!/bin/bash
# определяем переменные
PORT="port_number"
MUSER="root"
MPASS="password"
DPATCH="/var/backups/db/backup.$(date +%H-%M_%d.%m.%y).sql"
DBGZIP="/var/backups/db/backup.$(date +%H-%M_%d.%m.%y).tar.gz"
FTPU="ftp_usr"
FTPP="ftp_pwd"
FTPS="ftp_ip_or_host_name"
FTPF="dir"
FROM="From: backup@example.com"
TO="To: admin@example.com"
BODY1="Thank you"
BODY2="Wait new message"
# делаем дамп
mysqldump -u$MUSER -p$MPASS -A > $DPATCH
# упаковываем в архив
tar czfP $DBGZIP $DPATCH
# удаляем дамп
rm -rf $DPATCH
# проверяем сервер на доступность, загружаем и отправляем уведомление
if nc -zw 10 $FTPS $PORT
then
ncftpput -m -u$FTPU -p$FTPP $FTPS $FTPF $DBGZIP
SUBJECT="Subject: Backup complite"
BODY="Backup complite $(date +%H:%M-%d.%m.%y) file upload to $FTPS"
else
SUBJECT="Subject: Backup not complite"
BODY="WARNING!!! Backup not complite $(date +%H:%M-%d.%m.%y) file not upload to $FTPS"
fi
echo $FROM >> message.tmp
echo $TO >> message.tmp
echo $SUBJECT >> message.tmp
echo $BODY >> message.tmp
echo $BODY1 >> message.tmp
echo $BODY2 >> message.tmp
/usr/sbin/sendmail -t < message.tmp
rm message.tmp
Вот и все.
Можете протестировать сценарий
Напоминаю, что сделать его исполняемым довольно просто:
chmod +x script_name
Обратите внимание у нас добавилась переменная PORT