2016-04-12 16 views
0

Verbindung getrennt Wir verwenden die Apache Zookeeper Client C-Bindungen in unserer Anwendung. Client-Bibliothek Version ist 3.5.1. Wenn die Verbindung zum Zookeeper getrennt wird, ist die Anwendung so konfiguriert, dass sie mit Fehlercode 116 beendet wird.Prozess mit zookeeper C-Client wird auf SIGTERM

System wird zum automatischen Starten/Stoppen der Anwendung verwendet. Die Einheitendatei überschreibt nicht die Standardeinstellung für KillMode, also send SIGTERM to the application.

Wenn der Prozess der systemctl Stopp-Richtlinie gestoppt verwendet, scheinen die Zookeeper Client-Threads zu Zookeeper zu versuchen, wieder zu verbinden:

2016-04-12 22:34:45,799:4506(0xf14f7b40):[email protected][email protected]: 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):[email protected][email protected]: 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):[email protected][email protected]: session establishment complete on server [128.0.0.4:61758], sessionId=0x40000015b8d0077, negotiated timeout=20000 
2016-04-12 22:34:46,476:4506(0xf14f7b40):[email protected][email protected]: Delaying connection after exhaustively trying all servers [128.0.0.4:61758] 
2016-04-12 22:34:46,810:4506(0xf14f7b40):[email protected][email protected]: initiated connection to server [128.0.0.4:61758] 
2016-04-12 22:34:46,811:4506(0xf14f7b40):[email protected][email protected]: Socket [128.0.0.4:61758] zk retcode=-112, errno=116(Stale file handle): sessionId=0x40000015b8d0077 h 

Aus diesem Grund wird der Prozess mit einem Fehlercode verlässt. Systemd sieht beim Beenden einen Fehlercode und versucht nicht, die Anwendung neu zu starten. Weiß jemand, warum der Client die Verbindung trennt?

Ich bin mir bewusst, dass ich umgehen kann, indem Sie SuccessExitStatus=116 in der Unit-Datei einstellen, aber ich möchte echte Fehler nicht ausblenden. Ich habe versucht, einen Signalhandler für SIGTERM zu registrieren und den Zookeeper-Client im Handler zu schließen. Aber der Handler-Code scheint nie getroffen zu werden, wenn ich systemctl stop ausstelle.

EDIT: Der Handler wurde nicht aufgerufen, weil ich es asynchron gemacht hatte - es wurde nicht sofort nach Empfang des Signals ausgeführt. OTOH der Prozess wird sofort beendet, nachdem der Zookeeper die Verbindung getrennt hat.

+0

Dies ist, warum "nicht mehr reproduziert", OP im Chat angegeben "Ich habe herausgefunden, was in meiner Situation passiert, und es ist nicht mit der Beschreibung, die ich gab. Grundsätzlich jemand in meiner Organisation lief ein Skript, das tötete eine Verbindung, mir unbekannt ", daher auch letzte Abstimmung von OP –

Antwort

0

Das Problem ist nicht verwandt, jemand ein Skript ausgeführt wurde, der die Verbindung tötete. Danke Ihnen allen für Ihre Hilfe!

0

Was passiert, wenn Sie den Handler für SIGTERM laden und systemctrl stop ausgeben? Wenn nichts passiert, haben Sie möglicherweise eine Maske, die das Signal blockiert (ich denke nicht). Wenn die Anwendung immer mit dem gleichen Fehlercode beendet wird, würde ich vorschlagen, dass Sie sicherstellen, dass der Signalhandler korrekt geladen wird.

0

Dies wird erwartet, es ist Aufgabe des Anwendungsautors anzugeben, wie der Dienst ordnungsgemäß heruntergefahren werden soll. Wenn Sie nicht den Standard verwenden möchten, der SIGTERM sendet, können Sie den Befehl ExecStop verwenden, um einen eigenen Stoppbefehl zu erstellen die Unit-Dateien:

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

Details siehe docs bei https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStop=

+0

Ich möchte das Verhalten nicht ändern. Meine Frage ist, warum die Zookeeper-Client-Bibliothek diesen Fehlercode verursacht. Dies geschieht sogar mit einem Handler registriert –

+1

Das Protokoll, das Sie posted, zeigt zookeeper lib einen Netzwerkfehler beim Empfangen entdeckt, so dass es eine erneute Verbindung zum Server initiiert, es ist nichts falsch daran. Es sagt nichts über Signale aus. Es ist nicht die Tierpfleger-Bibliothek, die den Fehler "verursacht", sondern den Netzwerkfehler wie erwartet behandelt. – fluter

+0

Aber dieser "Netzwerkfehler" passiert nur, wenn ich einen Systemctl stop –