【问题标题】:Process using zookeeper C client gets disconnected on SIGTERM [closed]使用zookeeper C客户端的进程在SIGTERM上断开连接[关闭]
【发布时间】:2016-08-03 19:04:15
【问题描述】:

我们在应用程序中使用 Apache Zookeeper Client C 绑定。客户端库版本为 3.5.1。当 Zookeeper 连接断开时,应用程序配置为退出,错误代码为 116。

Systemd 被用于自动启动/停止应用程序。单元文件不会覆盖KillMode 的默认设置,即send SIGTERM to the application

当使用 systemctl stop 指令停止进程时,Zookeeper 客户端线程似乎正在尝试重新连接到 Zookeeper:

2016-04-12 22:34:45,799:4506(0xf14f7b40):ZOO_ERROR@handle_socket_error_msg@2363: Socket [128.0.0.4:61758] zk retcode=-4, errno=112(Host is down): failed while receiving a server response
2016-04-12 22:34:45,799:4506(0xf14f7b40):ZOO_INFO@check_events@2345: initiated connection to server [128.0.0.4:61758]
Apr 12 22:34:45 main thread:   zookeeperWatcher: event type ZOO_SESSION_EVENT state ZOO_CONNECTING_STATE path
2016-04-12 22:34:45,801:4506(0xf14f7b40):ZOO_INFO@check_events@2397: session establishment complete on server [128.0.0.4:61758], sessionId=0x40000015b8d0077, negotiated timeout=20000
2016-04-12 22:34:46,476:4506(0xf14f7b40):ZOO_WARN@zookeeper_interest@2191: Delaying connection after exhaustively trying all servers [128.0.0.4:61758]
2016-04-12 22:34:46,810:4506(0xf14f7b40):ZOO_INFO@check_events@2345: initiated connection to server [128.0.0.4:61758]
2016-04-12 22:34:46,811:4506(0xf14f7b40):ZOO_ERROR@handle_socket_error_msg@2382: Socket [128.0.0.4:61758] zk retcode=-112, errno=116(Stale file handle): sessionId=0x40000015b8d0077 h

因此,进程退出并出现错误代码。 Systemd 在退出时看到失败代码并且不会尝试重新启动应用程序。有谁知道为什么客户端断开连接?

我知道我可以通过在单元文件中设置SuccessExitStatus=116 来解决这个问题,但我不想掩盖真正的错误。我尝试为 SIGTERM 注册信号处理程序并在处理程序中关闭 Zookeeper 客户端。但是当我发出 systemctl stop 时,处理程序代码似乎永远不会受到影响。

编辑:处理程序没有被调用,因为我已经使它异步 - 它没有在收到信号后立即执行。 OTOH 进程在 Zookeeper 断开连接后立即退出。

【问题讨论】:

  • 这就是“不再复制”的原因,聊天中的 OP 表示“我弄清楚了我的情况发生了什么,这与我给出的描述无关。基本上我组织中的某个人正在运行一个正在杀死连接的脚本,我不知道”,因此也是 OP 的最后一票

标签: c systemd apache-zookeeper sigterm


【解决方案1】:

这个问题是无关的,有人正在运行一个终止连接的脚本。谢谢大家的帮助!

【讨论】:

    【解决方案2】:

    这是预期的工作,指定如何正常关闭服务是应用程序编写者的责任,如果您不想使用发送 SIGTERM 的默认值,您可以使用 ExecStop 在单位文件:

    ExecStart=/usr/bin/app
    ExecStop=/usr/bin/app -stop
    

    有关详细信息,请参阅文档 https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStop=

    【讨论】:

    • 我不想改变行为。我的问题是,为什么 Zookeeper 客户端库会导致此错误代码。即使注册了处理程序也会发生这种情况
    • 您发布的日志显示zookeeper lib在接收时检测到网络故障,因此它启动了与服务器的重新连接,这没有任何问题。它没有说明信号。不是 zookeeper 库“导致”错误,而是按预期处理网络故障。
    • 但是这种“网络故障”只有在我发出 systemctl stop 时才会发生
    • 可能是信号中断了recv例程并导致了重新连接,但zookeeper客户端仍然没有问题,它按预期工作,是应用程序需要处理它。
    • 还有一种方法,在单元文件中使用 SIGKILL ,这样它会完全杀死你的应用程序,或者你可以捕获 SIGTERM,并在其中调用 zookeeper shutdown 以便清理 zookeeper。
    【解决方案3】:

    当您加载 SIGTERM 的处理程序并发出 systemctrl stop 时会发生什么? 如果什么都没发生,那么您可能有一个屏蔽信号的面罩(我猜不是)。 如果应用程序一直以相同的错误代码退出,那么我建议您确保正确加载信号处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多