如何在使用 systemd 关机时先运行其他所有脚本?

如何在使用 systemd 关机时先运行其他所有脚本?

注:简要表述的问题可以在底部找到。

我有一个脚本,可以将我的文件备份到外部 USB 驱动器上。执行它可能需要一段时间,具体取决于我创建的新数据量。我想在每次系统关闭时自动运行它。

我正在使用带有最新更新(systemd)的 fedora 23。

我尝试用多种方法实现这一点,但都无法让它发挥作用。

使用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,真是巧合。

在shutdown.target之前

自动备份.服务:

[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 在关机时首先启动我的脚本,等到它退出,然后再启动其余的关机脚本/目标/单元/等等?

答案1

我得到了它!

采取解决方案使用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

这样它就可以按预期工作。

答案2

无需创建或编辑服务文件。只需将脚本放入

/usr/lib/systemd/system-shutdown/

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

在执行实际系统 halt/poweroff/reboot/kexec 之前,systemd-shutdown 将运行 /usr/lib/systemd/system-shutdown/ 中的所有可执行文件,并向它们传递一个参数:“halt”、“poweroff”、“rebo​​ot”或“kexec”,具体取决于所选操作。此目录中的所有可执行文件均并行执行,并且在所有可执行文件完成之前不会继续执行操作。

我使用它只是让电脑扬声器发出蜂鸣声。

相关内容