Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用zookeeper C客户端的进程在SIGTERM上断开连接_C_Systemd_Apache Zookeeper_Sigterm - Fatal编程技术网

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

使用zookeeper C客户端的进程在SIGTERM上断开连接,c,systemd,apache-zookeeper,sigterm,C,Systemd,Apache Zookeeper,Sigterm,我们在应用程序中使用ApacheZooKeeper客户端C绑定。客户端库版本为3.5.1。当Zookeeper连接断开时,应用程序被配置为退出,错误代码为116 Systemd用于自动启动/停止应用程序。单位文件不会覆盖KillMode的默认设置,即为 当使用systemctl stop指令停止进程时,Zookeeper客户端线程似乎正在尝试重新连接到Zookeeper: 2016-04-12 22:34:45,799:4506(0xf14f7b40):ZOO_ERROR@handle_sock

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

Systemd用于自动启动/停止应用程序。单位文件不会覆盖
KillMode
的默认设置,即为

当使用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时,处理程序代码似乎从未被击中


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

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

这是正常的,如果您不想使用发送SIGTERM,您可以使用ExecStop在单元文件中生成自己的stop命令:

ExecStart=/usr/bin/app
ExecStop=/usr/bin/app -stop
有关详细信息,请参阅

问题与此无关,有人运行的脚本正在终止连接。谢谢大家的帮助

我不想改变这种行为。我的问题是,为什么Zookeeper客户端库会导致此错误代码。即使注册了处理程序,也会发生这种情况。您发布的日志显示zookeeper lib在接收时检测到网络故障,因此它启动了与服务器的重新连接,这没有问题。它没有提到信号。不是zookeeper库“导致”了错误,而是按照预期处理了网络故障。但只有当我发出systemctl Stop时,才会发生这种“网络故障”。可能是信号中断了recv例程并导致重新连接,但zookeeper客户端仍然没有问题,它按预期工作,这是应用程序需要处理的问题。还有另一种方法,在单位文件中使用SIGKILL,这样它会完全杀死你的应用程序,或者你可以捕获SIGTERM,然后在其中调用zookeeper shutdown,这样zookeeper就会被清理。这就是为什么“不再复制”,OP in chat说“我知道我的处境发生了什么,这与我描述的情况无关。基本上,我的组织中有人正在运行一个脚本,该脚本正在终止一个我不知道的连接”,因此也是OP的最后一票