注:简要表述的问题可以在底部找到。
我有一个脚本,可以将我的文件备份到外部 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”、“reboot”或“kexec”,具体取决于所选操作。此目录中的所有可执行文件均并行执行,并且在所有可执行文件完成之前不会继续执行操作。
我使用它只是让电脑扬声器发出蜂鸣声。