Как использовать 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 и его представлению на вопрос в
Мне не хватало одной строки в моем определении [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
Остальные инструкции выше все еще хороши.
Я предполагаю, что диски были размонтированы до вызова службы, поэтому служба не могла делать то, что должна была сделать.
Если кто-то видит в этом недостаток, не стесняйтесь комментировать.