如何才能让我的服务成为系统重启/关闭时第一个停止的服务?

如何才能让我的服务成为系统重启/关闭时第一个停止的服务?

我正在尝试让自定义服务在重新启动时关闭应用程序,我可以让服务文件正常工作到一定程度,即我的自定义服务需要在 network.target 脱机和 NFS 卸载之前关闭。我尝试将 network.target 添加到单元文件的 Before 行。以下是我目前所拥有的,除了需要访问网络才能发出命令才能成功完成之外,一切似乎都正常。这是我到目前为止的服务文件:

[Unit]
Description=Kubernetes startup and shutdown
DefaultDependencies=no
Before=remote-fs.target network.target reboot.target shutdown.target halt.target

[Service]
Type=forking
ExecStart=/bin/bash -c '/root/kube-stop.sh'
RemainAfterExit=yes

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

看来我能够通过在“Before”语句中使用 sshd 服务并删除“RemainAfterExit”来朝着正确的方向前进,因为这似乎更适合一次性服务类型:

[Unit]
Description=Kubernetes startup and shutdown
DefaultDependencies=no
Before=sshd.service

[Service]
Type=forking
ExecStart=/bin/bash -c '/root/kube-stop.sh'

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

答案1

看来我能够通过在“Before”语句中使用 sshd 服务并删除“RemainAfterExit”来朝着正确的方向前进,因为这似乎更适合一次性服务类型:

但你所拥有的一次性服务,因为它不会启动任何长时间运行的守护进程 - 它只执行一个简短的任务然后退出,这就是它的真正用途Type=oneshot

事实上在这种情况下你想要两个都 Type=oneshot并且RemainAfterExit=yes,因为运行具有复杂依赖关系的关机命令的最简单方法是运行它们ExecStop=

也就是说,您应该有一个ExecStart=什么都不做的(当前 systemd 版本允许您完全省略它,对于较旧的版本,只需执行 /bin/true),以及ExecStop=一个实际上告诉 Kubernetes 停止自身。然后,该单元应该像任何其他服务一样在启动时启动。

这是因为服务在关机时停止的顺序与启动的顺序几乎相反 - 如果您的设备需要网络可用,它应该有After=network.target,以便它在网络之后启动,但在网络之前停止。

[Unit]
Description=Kubernetes startup and shutdown
After=network.target
After=kubernetes-or-something.service

[Service]
Type=oneshot
# ExecStart=/bin/true
ExecStop=/root/kube-stop.sh

[Install]
WantedBy=multi-user.target

(除非你的命令使用了 shell 语法特性,否则你不需要/bin/sh -c ...。执行 .sh 脚本是不是shell 语法特性。

相关内容