2016-09-04 12 views
0

Может ли кто-нибудь, кто знает 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) Создайте следующий сценарий, используя Счастливчик резервного копирования для создания команды 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)

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

ответ

0

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

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

я пропускал одну строку в моей [Unit] definiiton

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 

Остальные инструкции выше по-прежнему хорошо.

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

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

+0

Вышеупомянутый должен читать «Итак, он работает ...» – Ramblin

 Смежные вопросы

  • Нет связанных вопросов^_^