Как запустить сценарий перед завершением работы с systemd?

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

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

13
задан le_me
05.02.2023 2:26 Количество просмотров материала 3648
Распечатать страницу

2 ответа

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

/usr/lib/systemd/system-shutdown/

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

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

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

9
отвечен Joost 2023-02-06 10:14

Я понял!

принять решение длительный процесс с StopExec и изменить его вот так:

ь.обслуживание:

[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

это работает так, как ожидалось.

9
отвечен le_me 2023-02-06 12:31

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх