14

Примечание: кратко сформулированный вопрос можно найти внизу.

У меня есть скрипт, который делает резервную копию моих файлов на внешний USB-накопитель. Выполнение этого может занять некоторое время, в зависимости от количества новых данных, которые я создал. Я хочу запускать его автоматически при каждом выключении системы.

Я использую Fedora 23 с последними обновлениями (systemd).

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

Длительный процесс с StopExec

autobackup.service:

[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 непосредственно перед запуском скрипта, забавное совпадение ..

Перед выключением. Цель

autobackup.service:

[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 запускает мой сценарий параллельно со всеми другими сценариями завершения работы в обоих случаях, которые размонтируют BACKUP и деактивируют инфраструктуру канала (еще одна ошибка, которую я иногда получал, когда размонтирование было недостаточно быстрым).

Вопрос

Как я могу научить systemd сначала запускать мой скрипт при завершении работы, ждать, пока он не выйдет, а затем запустить остальные сценарии завершения работы / цели / модули / что угодно?

2 ответа2

10

Я понял!

Возьмите решение Долгосрочный процесс с StopExec и измените его следующим образом:

autobackup.service:

[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home

[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Обратите внимание на строку:

RequiresMountsFor=/mnt/BACKUP /home

Это работает, как ожидалось, таким образом.

10

Нет необходимости создавать или редактировать служебные файлы. Просто оставьте свой скрипт в

/usr/lib/systemd/system-shutdown/

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

Непосредственно перед выполнением фактической остановки системы /poweroff /reboot /kexec systemd-shutdown запустит все исполняемые файлы в /usr /lib /systemd /system-shutdown / и передаст им один аргумент: либо "halt", "poweroff", "reboot" "или" kexec ", в зависимости от выбранного действия. Все исполняемые файлы в этом каталоге выполняются параллельно, и выполнение действия не продолжается до завершения всех исполняемых файлов.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .