我有一个安装和设置流量服务器的脚本:
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问题是,traffic_line在以下方面失败:
连接错误(main_socket_fd 3):没有这样的文件或目录错误:无法连接到管理端口,确保traffic_manager正在运行
这是因为systemctl start会立即返回,而无需等待实际启动流量服务器。
systemctl start只在服务启动后才返回吗?如果这是不可能的,那么我是否可以在systemctl start之后运行一个命令来实际等待服务的启动?
发布于 2018-05-31 15:39:11
这是因为
systemctl start会立即返回,而无需等待实际启动流量服务器。有办法告诉systemctl start只在服务启动后才返回吗?
systemctl start确实在等待服务准备就绪(除非使用--no-block调用),该服务只需要正确地指示(即 e.,而不是使用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的套接字,而不是在主进程中分配自己的、分叉和适当等待,或者调用sd_notify。如果服务器不合作,systemd无法神奇地猜测服务器何时准备就绪:)
在看过trafficserver的S源代码之后,它看起来可能实际上支持Type=forking --服务器是由一个专用的traffic_cop命令生成的,该命令似乎要等到服务器启动并执行一些基本测试(至少代码看起来是这样的)。因此,如果您更改了服务类型,它可能只起作用:
# /etc/systemd/system/trafficserver.service.d/type-forking.conf
[Service]
Type=forking发布于 2017-12-06 11:03:05
我在shell脚本方面做得不好,但我认为如果返回是活动的和正在运行的,那么您应该同时测试ActiveState和SubState属性。
$ systemctl show trafficserver -p SubState,ActiveState
ActiveState=active
SubState=running之后,您应该能够运行您的脚本的第二部分。
发布于 2017-12-05 12:49:28
https://serverfault.com/questions/886641
复制相似问题