Linux:如何使用 systemd 在关机时真正执行脚本(而不是更早!)?

Linux:如何使用 systemd 在关机时真正执行脚本(而不是更早!)?

我正在运行一个装有 x86-64 Arch Linux 的主机,该主机装有最新更新的 Plasma。在这里,我使用 wakeonlan 连接 NAS,它工作正常,因此我可以在成功 ping NAS 后挂载 nfs 和 Samba 共享。

这是通过 systemd 服务完成的,在启动我的主机 (tuxarch) 时启动 (启用)。我已经在我的 NAS 上安装了适用于 arm 处理器的 Arch OS。有了远程 NAS 上的正确权限,我可以从主机 tuxarch 通过 ssh 关闭 (systemctl poweroff) 此 NAS。我有一个小的批处理文件,我在其中卸载了 nfs 和 cifs 挂载的共享,卸载后我通过 ssh 发送“systemctl poweroff”命令。这个批处理文件执行了我期望的操作,最后 NAS 关闭了,电源关闭了。

现在我想在关闭主机之前通过 systemd 服务执行此批处理文件,此时主机上仍挂载着共享(以便安全地卸载它们),并且仍然与远程 NAS 建立网络连接,最后发送命令“sudo -u tuxuser ssh -t[电子邮件保护]'sudo systemctl poweroff'“关闭(断电)我的 NAS。

为此,我创建了几个不同的shutdown.Zyxel.NAS.service。一次一个,然后采用。要测试和激活实际服务,我没有启用此服务,我只是使用以下命令启动服务:systemctl start shutdown.Zyxel.NAS.service。现在,我的问题是,批处理文件在服务启动时立即执行,而不是等到触发关机。我尝试了几种此类服务的配置,这是我的最后一个:

systemctl cat shutdown.Zyxel.NAS

/etc/systemd/system/shutdown.Zyxel.NAS.service
[Unit]
Description=Shutdown Remote Zyxel NAS
DefaultDependencies=no
Requires=network-online.target
RequiresMountsFor=/mnt/Zyxel-Nas
After=final.target

[Service]
User=tuxuser
Group=tuxuser
ExecStart=/home/tuxuser/ssh.Zyxel.NAS.poweroff.sh
Type=oneshot

[Install]
WantedBy=final.target[/code]

因此,正如我所说,该服务立即启动 /home/tuxuser 中的批处理文件。我的 shutdown.Zyxel.Nas.service 出了什么问题?我想知道,为什么该服务在发出开始关机过程的信号之前毫不犹豫。任何帮助、任何好的建议都值得赞赏。

先感谢您!

—Linuxwhisperer

答案1

我想知道,为什么这个服务在发出开始关闭过程的信号之前不会犹豫。

服务中没有任何东西它应该等待。

After=不会按照你的想法执行。它不是触发器,也不是计时器。它只告诉 systemd 如何对作业进行排序在同一任务中(事务) – 例如,在系统启动期间,有 20–30 个服务同时启动,因此使用 Before= 和 After= 对它们进行相互排序。

但如果你手动启动shutdown-NAS.service但final.target尚未启动现在,那么 After=final.target 不执行任何操作。

建议:

  • 选项 1:永远不要手动启动服务。使用 激活它systemctl enable(以便由 final.target 调用它)并使用 停用systemctl disable

  • 选项 2:首先将您的单元更改为在启动时启动(像任何其他服务一样的 multi-user.target),并且有ExecStart=/bin/true,即在启动时不执行任何操作。然后将您的脚本移动到ExecStop=,如下所示:

    [Service]
    ExecStart=/bin/true
    ExecStop=/home/tuxuser/ssh.Zyxel.NAS.poweroff.sh
    Type=oneshot
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    

相关内容