我是编写这些服务文件的新手,我通过关注堆栈和 unix 溢出中的几个博客编写了一个 systemd 服务文件。
我有一个脚本需要在关机时运行,它需要运行 docker 守护进程。服务文件看起来像这样
[Unit]
Description=Shutdown script
Before=shutdown.target
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/path/to/script
[Install]
WantedBy=multi-user.target
我试图通过在 shell 脚本中添加以下内容,在实例的启动脚本中自动创建/启用上述服务(运行脚本)
chmod +x /path/to/script
if [ ! -f "/etc/systemd/system/path.service" ]; then
cp file/path.service /etc/systemd/system/path.service
systemctl daemon-reload
fi
systemctl enable path.service
我希望它在每次关机时运行,但它在实例启动时运行。我在上面的服务文件中做错了吗?
查看:systemd-poweroff.service, systemd-halt.service, systemd-reboot.service, systemd-kexec.service, systemd-shutdown——系统关闭逻辑
systemd-poweroff.service是poweroff.target拉入的系统服务,负责实际的系统断电操作。同样,systemd-halt.service 由 halt.target 拉入,systemd-reboot.service 由 reboot.target 拉入,systemd-kexec.service 由 kexec.target 拉入,以执行相应的操作。
当这些服务运行时,它们确保 PID 1 被 /usr/lib/systemd/systemd-shutdown 工具替换,该工具随后负责实际关闭。在关闭之前,这个二进制文件将尝试卸载所有剩余的文件系统、禁用所有剩余的交换设备、分离所有剩余的存储设备并终止所有剩余的进程。
有必要将此代码放在单独的二进制文件中,否则升级后重新启动可能会中断——正在运行的 PID 1 可能仍然依赖于不再可用的库,从而使文件系统保持忙碌,然后无法重新启动-mounted 只读。
在执行实际系统 power-off/halt/reboot/kexec 之前,systemd-shutdown 将运行 /usr/lib/systemd/system-shutdown/ 中的所有可执行文件,并向它们传递一个参数:“poweroff”、“halt” 、“重新启动”或“kexec”,具体取决于所选的操作。该目录中的所有可执行文件并行执行,并且在所有可执行文件完成之前不会继续执行操作。
注意 systemd-poweroff.service(和相关单元)不应该直接执行。相反,使用诸如“systemctl poweroff”之类的命令触发系统关闭。
由于操作系统已经有关机时的服务,只需在 /usr/lib/systemd/system-shutdown/ 中添加您的 bash 可执行文件,这将使其在关机时运行