![关闭前使用 systemd 服务运行脚本需要很长时间并且无法完成](https://linux22.com/image/177339/%E5%85%B3%E9%97%AD%E5%89%8D%E4%BD%BF%E7%94%A8%20systemd%20%E6%9C%8D%E5%8A%A1%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E9%9C%80%E8%A6%81%E5%BE%88%E9%95%BF%E6%97%B6%E9%97%B4%E5%B9%B6%E4%B8%94%E6%97%A0%E6%B3%95%E5%AE%8C%E6%88%90.png)
我已在 systemd 中成功创建了一项服务,该服务在服务器关闭/重新启动之前运行脚本。但问题是我的脚本执行时间太长(大约 3-4 分钟)并且服务器在完成之前关闭。调试日志表明脚本确实正在运行,但中途停止了。
以下是我实现此服务的两种不同方法:
[Unit]
Description=Stop Service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/user/stop-service.sh
[Install]
WantedBy=multi-user.target
和
[Unit]
Description=Stop Service
DefaultDependencies=no
Before=final.target
[Service]
ExecStart=/home/user/stop-service.sh
[Install]
WantedBy=final.target
他们都成功调用,stop-service.sh
但脚本运行时间太长。有什么方法可以确保stop-service.sh
在服务器完全关闭之前完成运行吗?
我的服务器是RHEL7。
答案1
我找到了一种适合我的方法:
[Unit]
Description=Stop Service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/user/stop-service.sh
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
根据我的研究,systemd 服务在发送终端信号之前,每个服务运行其停止命令 (ExecStop) 的默认等待时间为 90 秒。 TimeoutStopSec=300 会将一项特定服务的等待时间设置为 5 分钟。
如果要更改默认等待时间,可以找到文件 /etc/systemd/system.conf 并修改 DefaultTimeoutStopSec 的值,然后使用以下命令重新加载守护进程
systemctl daemon-reload
加载新值。