使用zookeeper C客户端的进程在SIGTERM上断开连接

时间:2016-04-12 23:01:19

标签: c systemd apache-zookeeper sigterm

我们在应用程序中使用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断开连接后立即退出。

3 个答案:

答案 0 :(得分:0)

加载SIGTERM的处理程序并发出systemctrl stop时会发生什么? 如果什么也没发生,那么你可能有一个遮挡信号的掩码(我猜不是)。 如果应用程序继续使用相同的错误代码退出,那么我建议您确保正确加载信号处理程序。

答案 1 :(得分:0)

这是预期的,应用程序编写者有责任指定如何正常关闭服务,如果您不想使用默认的,发送SIGTERM,您可以使用ExecStop在单元文件中创建自己的停止命令:

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

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

答案 2 :(得分:0)

问题无关紧要,有人正在运行一个破坏连接的脚本。谢谢大家的帮助!