我正在尝试让自定义服务在重新启动时关闭应用程序,我可以让服务文件正常工作到一定程度,即我的自定义服务需要在 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 语法特性。