systemctl start trafficserver 等待启动

Ben*_*rel 7 apache-traffic-server systemd systemctl

我有一个安装和设置流量服务器的脚本:

yum install -y trafficserver
systemctl start trafficserver

traffic_line -s proxy.config.url_remap.remap_required -v 0
traffic_line -s proxy.config.reverse_proxy.enabled -v 0
Run Code Online (Sandbox Code Playgroud)

问题是,traffic_line失败了:

[connect] ERROR (main_socket_fd 3): No such file or directory 错误:无法连接到管理端口,确保traffic_manager正在运行

这是因为systemctl start立即返回,无需等待流量服务器实际启动。

有没有办法告诉systemctl start只有在服务启动后才返回?

如果这是不可能的,是否有我可以运行的命令systemctl start来实际等待服务启动?

Luc*_*ter 9

这是因为systemctl start立即返回,无需等待流量服务器实际启动。

有没有办法告诉systemctl start只有在服务启动后才返回?

systemctl start 确实等待服务准备好(除非使用 调用--no-block),服务只需要正确指示(即,不使用Type=simple)。如果服务在准备好时没有告诉 systemd systemctl is-activesystemctl show, 等的任何变体都不会帮助您。

正如评论中提到的,最优雅的解决方案是插座单元。systemd 启动套接字,traffic_line连接到它,systemd 启动服务,然后traffic_line阻塞直到服务开始接受它从 systemd 继承的文件描述符上的连接。

或者,您可以使用Type=forking(服务分叉,一旦分叉的服务准备好,主 PID 退出)或Type=notify(服务sd_notify(0, "READY=1")一旦准备好就调用)。

不幸的是,所有这些解决方案都需要一些支持trafficserver——使用 systemd 的套接字而不是分配自己的套接字,在主进程中适当地 fork 和等待,或者调用sd_notify. 如果服务器不合作,systemd 无法神奇地猜测服务器何时准备就绪 :)


trafficserver稍微看了一下的源代码后,看起来它实际上可能支持Type=forking- 服务器由专用traffic_cop命令产生,该命令似乎等到服务器启动并执行一些基本测试(至少代码看起来像这样) . 因此,如果您更改服务类型,它可能会起作用:

# /etc/systemd/system/trafficserver.service.d/type-forking.conf
[Service]
Type=forking
Run Code Online (Sandbox Code Playgroud)