如何允许 systemd 中启动缓慢的依赖服务

如何允许 systemd 中启动缓慢的依赖服务

有时,服务会启动并分叉 - 让 systemd 误以为它已经准备就绪 - 即使它尚未完成“预热”。在这个特定实例中,我使用 ApacheDS 提供 LDAP 服务。启动此单元后,检查“systemctl status apacheds”将显示它正在运行,并显示一行日志:

4 月 4 日 15:34:33 daisy systemd[1]:已启动 Apache 目录服务器。

但是...它还没有提供服务。除非端口测试(如“lsof -i :389”或“netstat -pan | grep :389 | grep LISTEN”)显示有一个活动侦听器,否则没有可用的 LDAP。

不管它是否应该这样做——这需要大约 2 分钟才能完全启动。我的问题不是 ApacheDS 是否坏了或者是否应该被替换——而是如何处理 systemd 中初始化服务缓慢的问题。

有没有办法将这样的测试放入 systemd,要么告诉它等到有效才显示 apacheds 服务已启动,要么将其作为依赖服务的先决条件,而不会让它们简单地失败并仍然拒绝启动?

这是一个有效的测试脚本:

#!/bin/bash
TRIES=30
WAIT=10

while /bin/netstat -an | /bin/grep \:10389 | /bin/grep LISTEN ; [ $? -ne 0 ]; do
    let TRIES-=1
    if [ $TRIES -gt 1 ]; then
            sleep $WAIT
    fi
done

答案1

您可以ExecStartPost=foo向单元文件中添加一个脚本foo,该脚本会检查(并重新检查)直到服务可用。

编辑:您可能还需要增加TimeoutStartSec。默认值为 90 秒。

相关内容