我正在尝试让自定义服务在重新启动时关闭应用程序,我可以让服务文件正常工作到某个点,即我的自定义服务需要在 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
但是你所拥有的是一个单一的服务,因为它不会启动任何长时间运行的守护进程——它只是执行一个简短的任务并退出,这就是它的真正
Type=oneshot
用途。实际上,在这种情况下,您需要和
Type=oneshot
,RemainAfterExit=yes
因为运行具有复杂依赖关系的关闭命令的最简单方法是从ExecStop=
.也就是说,你应该有一个
ExecStart=
什么都不做的东西(当前的 systemd 版本允许你完全忽略它,因为旧版本只执行 /bin/true),同时ExecStop=
它实际上告诉 Kubernetes 自己停止。然后应该像任何其他服务一样简单地在启动时启动该单元。这是因为服务在关闭时停止的顺序几乎与它们启动时的顺序相反——如果您的设备需要网络可用,它应该有
After=network.target
,以便它在网络之后启动,但在网络之前停止。(除非您的命令使用 shell 语法功能,否则您不需要
/bin/sh -c ...
。执行 .sh 脚本不是shell 语法功能。)