如何让 systemd 等待 zfs 回滚完成

如何让 systemd 等待 zfs 回滚完成

我正在尝试编写一个 systemd 服务文件,该文件将调用脚本在启动和关闭时回滚 zfs 数据集。启动部分工作得很好,但我在关闭过程中不断遇到内核恐慌。

在此输入图像描述

我认为 systemd 正在继续并在 zfs 完成回滚之前关闭一些重要的东西。

有没有人有什么建议?这是我当前的服务文件。

[Unit]
Description=Public Rollback Service
After=zfs.target
Requires=zfs.target

[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh
RemainAfterExit=True
ExecStop=/bin/sh /usr/local/bin/public_rollback.sh

[Install]
WantedBy=multi-user.target

它调用的脚本只是:

 #!/bin/sh

 if zfs rollback $(zfs list -H -o name -t snapshot -r tank/public | tail -1); then
     exit 0
 else
     echo "Could not rollback public dataset! Aborting." 1>&2
     exit 1
 fi

答案1

所以看来我对问题出在哪里是错误的。在检查日志后,我试图在数据集仍然繁忙时回滚数据集(我假设以某种方式进行了注销过程)。

我在主 ExecStop 命令之前添加了一个附加ExecStop=/bin/sleep 1命令,以便有时间准备好回滚,从那以后我就没有遇到过问题。

答案2

也许您可以使用两种服务:一种用于启动,一种用于关闭。您拥有的ExecStop用于启动的(减去指令)。像这样在关闭之前触发脚本:

[Unit]
Description=Public Rollback Shutdown Service
DefaultDependencies=no
Before=halt.target shutdown.target reboot.target

[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh

[Install]
WantedBy=halt.target shutdown.target reboot.target 

相关内容