При запуске скрипта делающего бэкап по таймеру в systemd столкнулся с такой проблемой, часть вывода не попадает в лог файл. При этом если запустить скрипт в ручную все ок, если делать запуск скрипта из cron, то тоже, но хочется понять почему в systemd работает не так как я ожидал. Опыта в этом дел мало, скрипт написан по подобию. Лог чаще всего обрывается перед выводом массива REPORT, хотя периодически его все же выводит.
#!/bin/bash
## Задание переменных окружения
LOG="/var/log/borg/backup.log"
export BORG_REPO="/var/backups/borg"
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
info() { printf "%s %s\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
# Вывод в файл журнала
exec > >(tee -ai ${LOG})
exec 2>&1
REPORT=()
if [ $(id -u) != 0 ]; then echo "You should run this script as root"; exit; fi
echo "****************************Starting backup***********************************"
# Дамп базы данных
info "Dump databases"
mysqldump -u seafile -pomee2Poh -c ccnet_db > /var/backups/tmp/sqldump/ccnet_db.sql
dump_ccnet_exit=$?
mysqldump -u seafile -pomee2Poh -c seafile_db > /var/backups/tmp/sqldump/seafile_db.sql
dump_seafile_exit=$?
mysqldump -u seafile -pomee2Poh -c seahub_db > /var/backups/tmp/sqldump/seahub_db.sql
dump_seahub_exit=$?
# Передача файлов в репозиторий.
info "Transfer files ..."
borg create -v --stats --compression lz4 \
::'{hostname}-{now:%Y-%m-%d_%H:%M:%S}' \
/opt/seafile \
/mnt/s/seafile-data \
/var/backups/tmp
backup_exit=$?
info "Pruning repository"
# Сколько и каких версий резервных копий хранить
borg prune -v --prefix '{hostname}-' \
--keep-hourly=9 \
--keep-daily=14 \
--keep-weekly=4 \
--keep-monthly=3
prune_exit=$?
# Результат дампа баз данных
if [ ${dump_ccnet_exit} -ne 0 ] ; then
REPORT+=("Dump ccnet_db failed with exit code ${dump_ccnet_exit}")
elif [ ${dump_seafile_exit} -ne 0 ] ; then
REPORT+=("Dump seafile_db failed with exit code ${dump_seafile_exit}")
elif [ ${dump_seahub_exit} -ne 0 ] ; then
REPORT+=("Dump seahub_db failed with exit code ${dump_seahub_exit}")
else
REPORT+=("Dump finished - ok")
fi
# Результат бэкапа
if [ ${backup_exit} -eq 1 ]; then
REPORT+=("Backup finished with a warning code ${backup_exit}")
elif [ ${backup_exit} -ne 0 ]; then
REPORT+=("Backup finished with an error code ${backup_exit}")
else
REPORT+=("Backup finished - ok")
fi
# Результат очистки бэкапа
if [ ${prune_exit} -eq 1 ]; then
REPORT+=("Prune finished with a warning code ${prune_exit}")
elif [ ${prune_exit} -ne 0 ]; then
REPORT+=("Prune finished with an error ${prune_exit}")
else
REPORT+=("Prune finished - ok")
fi
df -hl | grep --color=never /dev/sdc
borg list $BORG_REPO
printf '%s\n' "${REPORT[@]}"
# Статус выполнения скрипта большее из значений статусов бэкапа и очистки
global_exit=$((backup_exit + prune_exit + dump_ccnet_exit + dump_seafile_exit + dump_seahub_exit))
if [ ${global_exit} -ne 0 ] ; then
printf '%s\n' "${REPORT[@]}" | mail -s "Seafile backup" mail@ya.ru
fi
echo -e "\n\n"
exit ${global_exit}