LINUX.ORG.RU
ФорумAdmin

Centos выполнение скрипта при загрузке.

 , , ,


1

1

Добрый день. Есть некий скрипт, который дергается при старте системы systemd юнитом. Скрипт служит для бекапа файлов с удаленной smb шары.

Т.е. логика такая - cистема запускается и начинает читать юниты:

1. Юнит монтирования удаленной шары:

[Unit]
Description=CIFS Share from spr1-backup01
After=network-online.target

[Mount]
What=//192.168.18.12/oracle_backup
Where=/mnt/smb
Type=cifs
Options=ro,vers=2.1,credentials=/root/creds/.cred_oralocalsys

[Install]
WantedBy=multi-user.target

2. Юнит, который запускает скрипт бекапа

[Unit]
Description=Backup oracle database
After=mnt-smb.mount

[Service]
Type=simple
ExecStart=/root/nas/sender.sh
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Проблема в том, что если скрипт /root/nas/sender.sh (его исходник в самом начале по ссылке) запускается руками - всё работает замечательно.

Но если скрипт запускается при старте (через systemd unit), то не проходит непосредственно сама процедура резервной копии (та часть, которая вызывается rsync'ом).

При этом в самом скрипте уже есть проверка на то, примонтирована ли шара откуда мы копируем данные.

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


Ответ на: комментарий от afanasiy

удваиваю

StandardOutput=journal по идее не нужно, оно и так stdout в journal пишет

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

Попробуй

MOUNTSTATUS=`systemctl is-active mnt-smb.mount`

поменять на

MOUNTSTATUS=`/bin/systemctl is-active mnt-smb.mount`

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

Я тоже подумал в сторону переменных и на всякий случай изменил уже все вызовы системных приложений на полный путь, в rsync тоже поменял. К сожалению эффекта не дало. Новый исходник sender.sh - https://pastebin.com/WWSXGtX8

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

Попробуй понавыткать что нибудь типа

echo "bla bla bla" >> log.txt
в строки, ну и посмотреть потом на каком этапе он стопорится.

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

Спасибо за мысль. Нашел где кроется проблема, но так и не понял почему так получается.

В функции sender есть 2 такие строчки:

/usr/bin/find . -mtime -2 -print | /usr/bin/tee -a /root/nas/logs/rsynclist.txt

/usr/bin/rsync -av --ignore-existing --size-only --log-file=/root/nas/logs/rsynclogfile.txt --files-from=/root/nas/logs/rsynclist.txt /mnt/smb/online/ /mnt/stora
ge/

find отрабатывает корректно, т.е. он находит новые файлы, которые младше двух дней и сливает пути к файлам в /root/nas/logs/rsynclist.txt

А вот rsync уже почему-то пропускает эти новые файлы (в секции --files-from).

Опять-же повторюсь - пропускает только если запускается автоматически при старте. Руками все работает.

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

Он стоял изначально, я в дальнейшем уже сменил на simple. С oneshot такая-же история.

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

Еще одна мысля:

Пути в файле /root/nas/logs/rsynclist.txt начинаются с точки?

Что если попробовать ее убрать?

Вместо

./var/log/syslog
сделать
/var/log/syslog

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

Дело в том, что там пути указаны относительно текущего каталога.

./file1 ./file2

Поэтому в начале я перехожу в этот каталог в скрипте, а потом уже работаю с файлами rsyncом

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

Вот выдержка из мана: The filenames that are read from the FILE are all relative to the source dir.

Т.е. там никогда не будет полного абсолютного пути.

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

Есть интересное наблюдение. Такое впечатление, что rsync в принципе не выполняется, если запускается автоматически.

Добавил проверку на успешность выполнения предыдущей команды: если запуск автоматический - сыпет ошибку в лог. Включил логирование rsync'a - если руками запускаю скрипт - то лог пишется, если автозапуск - то лог пустой.

/usr/bin/find . -mtime -2 -print | /usr/bin/tee /root/nas/logs/rsynclist.txt
/usr/bin/rsync --log-file=/root/nas/logs/rsync.log -av --ignore-existing --size-only --files-from=/root/nas/logs/rsynclist.txt /mnt/smb/online/ /mnt/storage/
        if [ $? -eq 0 ]; then
                echo 'RSYNC ended with 0 error code\n' | tee -a /root/nas/logs/debug.log
        else
                echo 'RSYNC ERROR\n' | tee -a /root/nas/logs/debug.log
        fi

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

Еще бредовые мысли...

Может стоить еще попробовать добавить в секцию [Service]

User=root
Group=root
или запускать rsync через sudo

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

Увы, увы. В общем пока забил на попытки добиться работы через systemd. Запускаю через /etc/rc.d/rc.local Спасибо за помощь :)

Jaels ()

а ещё говорят, что systemd прост и удобен

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