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
来实际等待服务启动?
这是因为
systemctl start
立即返回,无需等待流量服务器实际启动。有没有办法告诉
systemctl start
只有在服务启动后才返回?
systemctl start
确实等待服务准备好(除非使用 调用--no-block
),服务只需要正确指示(即,不使用Type=simple
)。如果服务在准备好时没有告诉 systemd systemctl is-active
,systemctl 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)