AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 886641
Accepted
BenMorel
BenMorel
Asked: 2017-12-06 04:35:04 +0800 CST2017-12-06 04:35:04 +0800 CST 2017-12-06 04:35:04 +0800 CST

systemctl start trafficserver 等待启动

  • 772

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

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失败了:

[connect] ERROR (main_socket_fd 3): No such file or directory error: could not connect to management port,确保traffic_manager正在运行

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

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

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

systemd
  • 4 4 个回答
  • 24520 Views

4 个回答

  • Voted
  1. Best Answer
    Lucas Werkmeister
    2018-06-01T07:39:11+08:002018-06-01T07:39:11+08:00

    这是因为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 的套接字而不是分配自己的套接字,在主进程中适当地分叉和等待,或者调用sd_notify. 如果服务器不合作,systemd 无法神奇地猜测服务器何时准备就绪 :)


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

    # /etc/systemd/system/trafficserver.service.d/type-forking.conf
    [Service]
    Type=forking
    
    • 9
  2. BenMorel
    2017-12-06T07:18:48+08:002017-12-06T07:18:48+08:00

    经过几次尝试,我终于让它工作了。

    第一次尝试

    在深入研究 systemctl help 后,我找到了is-active命令:

    $ systemctl is-active trafficserver
    active
    

    因此,我编写了一个 shell 脚本来等待服务激活:

    while true; do
        if [ $(systemctl is-active trafficserver) == "active" ]; then
            break
        fi
    
        sleep 1
    done
    

    不幸的是,即使当我使用启动/停止测试此脚本时,它按预期工作,但在它之后运行命令时,我仍然遇到相同的错误。traffic_line我认为该服务在实际进程完全启动之前报告为活动状态(可能是几毫秒)。

    第二次尝试

    所以我尝试了另一种方法。知道这是服务的第一次启动,我可以等到流量服务器管理器的 PID 文件存在。这是我尝试过的:

    while [ ! -f /run/trafficserver/manager.lock ]; do
      sleep 1
    done
    

    同样的问题:在写入流量服务器管理器的 PID 文件时,管理器实际上还没有准备好接收订单,所以我仍然收到错误消息。

    该死的,我不想用盲人sleep。

    第三次尝试

    所以我最终检查了traffic_line命令本身没有失败:

    while ! traffic_line --status &> /dev/null; do
        sleep 1
    done
    

    这行得通!

    不错,但是...

    不幸的是,答案非常具体到我正在使用的服务(trafficserver),并且不会直接适用于其他服务。

    如果您知道此问题的更通用答案,请随时分享。

    • 3
  3. Daniel
    2017-12-07T03:03:05+08:002017-12-07T03:03:05+08:00

    我不擅长 shell 脚本,但我认为如果分别返回active和running ,你会想要测试ActiveState和SubState属性。

    $ systemctl show trafficserver -p SubState,ActiveState
    ActiveState=active
    SubState=running
    

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

    • 2
  4. Simon Greenwood
    2017-12-06T04:49:28+08:002017-12-06T04:49:28+08:00

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

    sleep 30
    

    或者你可以在这里做一些工作控制

    • -1

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve