アプリケーションで Apache Zookeeper Client C バインディングを使用しています。クライアント ライブラリのバージョンは 3.5.1 です。Zookeeper 接続が切断されると、アプリケーションはエラー コード 116 で終了するように構成されています。
Systemd は、アプリケーションの開始/停止を自動化するために使用されています。ユニット ファイルは、SIGTERM をアプリケーション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 を発行しても、ハンドラ コードがヒットすることはないようです。
編集:ハンドラーを非同期にしたため、ハンドラーが呼び出されませんでした-シグナルを受信してもすぐに実行されませんでした。OTOH プロセスは、Zookeeper が切断されるとすぐに終了します。