首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >systemctl启动流量服务器等待启动

问systemctl启动流量服务器等待启动
EN

Server Fault用户
提问于 2017-12-05 12:35:04
回答 3查看 26.8K关注 0票数 11

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

代码语言:javascript
复制
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之后运行一个命令来实际等待服务的启动?

EN

回答 3

Server Fault用户

回答已采纳

发布于 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命令生成的,该命令似乎要等到服务器启动并执行一些基本测试(至少代码看起来是这样的)。因此,如果您更改了服务类型,它可能只起作用:

代码语言:javascript
复制
# /etc/systemd/system/trafficserver.service.d/type-forking.conf
[Service]
Type=forking
票数 12
EN

Server Fault用户

发布于 2017-12-06 11:03:05

我在shell脚本方面做得不好,但我认为如果返回是活动的和正在运行的,那么您应该同时测试ActiveState和SubState属性。

代码语言:javascript
复制
$ systemctl show trafficserver -p SubState,ActiveState
ActiveState=active
SubState=running

之后,您应该能够运行您的脚本的第二部分。

票数 2
EN

Server Fault用户

发布于 2017-12-05 12:49:28

最简单的方法是在脚本中添加一个睡眠:

代码语言:javascript
复制
sleep 30

或者您可以像这里那样执行一些作业控制。

票数 -1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/886641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档