LINUX.ORG.RU

systemd запуск скрипта по таймеру, проблема с выводом в файл

 , ,


0

1

При запуске скрипта делающего бэкап по таймеру в 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}

Вангую про PATH. Попробуй полные пути указать в скрипте.

Difrex ★★★★ ()

Лог чаще всего обрывается перед выводом массива REPORT, хотя периодически его все же выводит.

похоже на буферизирование вывода

pod ★★ ()

exec > >(tee -ai ${LOG})
exec 2>&1

в systemd не нужны эти костыли

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

А что, система инициализации теперь и задачами cron занимается?

«Какая гадость эта ваша заливная рыба ...»

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

Да я понимаю что в systemd есть свой журнал, и что интересно там вывод лога полный. Тут уже дело принципа понять что я делаю не так, из-за чего лог не всегда пишется полностью в заданный мною файл. Что-то не так с выводом массива REPORT.

Nine-tailed ()
Ответ на: комментарий от Nine-tailed

Сначала попробуй полные пути ко всем бинарникам указать. Или явно задать PATH через параметр Environment=, как советует Difrex.

При запуске bash из юнита никакие profile и bashrc не обрабатывается.

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

Да пути и так полные, скрипт же вызывается, бэкап тоже делается, и по команде journalctl лог полный, но в том файле, что указал для записи лога (LOG=«/var/log/borg/backup.log») вот в нем он обрывается в процентах 80 случаев.

Сейчас копаю в сторону буферизации вывода, т.к. в файл в основном не попадает вывод массива REPORT.

Nine-tailed ()
Ответ на: комментарий от Nine-tailed
# Вывод в файл журнала
exec > >(tee -ai ${LOG})
exec 2>&1

А задать stdout и stderr директивами юнита не вариант?

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

Пока решил вопрос добавлением в конце скрипта команды sleep 1.

С наскока через директивы юнита не получилось, поэкспериментирую позже как будет свободное время.

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