Примечание: кратко сформулированный вопрос можно найти внизу.
у меня есть скрипт, который делает резервную копию моих файлов на внешний USB-накопитель. Выполнение может занять некоторое время, в зависимости от количества новых данных, которые я создал. Я хочу запускать его автоматически при каждом выключении системы.
я использую fedora 23 с последними обновлениями (systemd).
Я пытался добиться этого можно несколькими способами, но я не мог заставить его работа.
длительный процесс с StopExec
ь.обслуживание:
[Unit]
Description=Slow backup script
Requires=local-fs.target
[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multiuser.target
Я активировал его с systemctl enable autobackup.service
и начал он с systemctl start autobackup.service
.
часть моего журнала загрузки (journalctl -b-1
):
Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.
обратите внимание, что я ничего не сокращал между ними, он действительно размонтирован /mnt/BACKUP незадолго до начала сценария, забавное совпадение..
перед выключение.цель
ь.обслуживание:
[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target
[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot
systemctl edit shutdown.target
[Unit]
Requires=autobackup.service
вывод в основном одинаковый.
Проблема
Я думаю, что проблема в том, что systemd запускает мой скрипт параллельно со всеми другими сценариями выключения в обоих случаях, которые размонтируют резервную копию и деактивируют инфраструктуру канала (Еще одна ошибка, которую я иногда получал, когда размонтирование было недостаточно быстрым).
Вопрос
как могу ли я научить systemd запускать мой скрипт сначала при завершении работы, ждать, пока он выйдет, а затем запускать остальные сценарии завершения работы/цели/единицы/что-то еще?