Как использовать systemd для активации скрипта для резервного копирования файлов при завершении работы

Может кто-нибудь, кто знает systemd, помогите мне понять, что я делаю неправильно?

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

Я использую Linux Mint 18 - на основе Ubuntu 16.04 - если это имеет значение для ответов.

Я включил то, что я сделал ниже, это результат чтения man-страниц для systemd и нескольких (часто конфликтующих) страниц форума здесь и в других местах, но я не заставляю его работать.

Я протестировал скрипт bash, и когда он запускается, он делает то, что я хочу.

Я вручную остановил mardibackup.service, запустив systemctl stop mardibackup.service, и он делает то, что я хочу.

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

Конкретные вопросы:

1) Зачем использовать multi-user.target и вызывать сервис, когда ExecStop срабатывает, останавливается? Почему бы просто не использовать shutdown.target и вызывать службу, когда запускается ExecStart?

2) Что должен делать ExecStart=/bin/true? Кажется, он ничего не делает, но есть во многих рекомендуемых ответах.

Помогите?? И благодарю вас.

Итак, вот что я сделал:

1) Создайте следующий сценарий, используя Lucky Backup для генерации команды rsync и поместите его в /home/mardi/Templates/backupmardi.sh (это работает, когда я запускаю его вручную из командной строки)

#!/bin/bash

# This program synchronizes the contents of mardi home directory
# to the archives disk in /backups/mardi
#
# It checks if a current version of a file is already copied and if so, does not change anything
# If a file is deleted in the home directory, it is NOT deleted from the archives

rsync -h --progress --stats -r -tgo -p -l -D --update --delete-after /home/mardi /mnt/7b2152a9-af3c-4f63-9287-98aacd9cb8ff/backups/

2) Измените права доступа к файлу скрипта, чтобы сделать его исполняемым

chmod +x /home/mardi/Templates/backupmardi.sh

3) Создайте следующий сервис shutdown/restart для вызова скрипта резервного копирования и поместите в /etc/systemd/system/mardibackup.service (это делает то, что я хочу, если я вручную "остановлю" его через systemctl stop mardibackup.service)

[Unit]
Description=Backup Mardi home dir to archives

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/bin/bash /home/mardi/Templates/backupmardi.sh

[Install]
WantedBy=multi-user.target

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

systemctl enable /etc/systemd/system/mardibackup.service
    (Note if you ever want to remove the symlink, enter: systemctl disable mardibackup.service)
systemctl start mardibackup.service

5) Завершение работы системы (я пробовал несколько выключений, но он не вызывает скрипт резервного копирования backupmardi.sh)

У кого-нибудь есть идеи?

1 ответ

Спасибо @le_me и его представлению на вопрос в

https://superuser.com/questions/1016827/how-do-i-run-a-script-before-everything-else-on-shutdown-with-systemd

Мне не хватало одной строки в моем определении [Unit]

RequiresMountsFor=/home /mnt/7b2152a9-af3c-4f63-9287-98aacd9cb8ff

/home домашний каталог главного диска/mnt/7b2152a9-af3c-4f63-9287-98aacd9cb8ff это дополнительный диск, на который я отправляю файлы резервных копий

Таким образом, сейчас работает с сервисом в /etc/systemd/system/mardibackup.service определяется как

[Unit]
Description=Backup Mardi home dir to archives
RequiresMountsFor=/home /mnt/7b2152a9-af3c-4f63-9287-98aacd9cb8ff

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/bin/bash /home/mardi/Templates/backupmardi.sh

[Install]
WantedBy=multi-user.target

Остальные инструкции выше все еще хороши.

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

Если кто-то видит в этом недостаток, не стесняйтесь комментировать.

Другие вопросы по тегам