我正在尝试编写一个 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