HAP2プラグインを構成するプロセスの関係性
概要
前回の記事( HAP2プラグインのベースライブラリ動作概要)ではHAP2プラグインを構成する4つのプロセスについて説明しました。それらは、下の図に示す親子関係を形成しています。
psコマンドなどでプロセス一覧を取得しても、どのプロセスもコマンド名はpythonなので、どのプロセスがどの役割に対応しているかが直感的にわかりにくいのですが、上記の図を元にPPIDなども合わせれば、ある程度特定ができます。
4つのプロセスは同一のプロセスグループに属します。また、例えば、2つ以上のhap2_zabbix_api.pyを起動した場合でも、それぞれのプロセスグループIDはユニークになります。
プラグインの自動復旧
hap2_starter.pyは、Hatoholサーバがローカルマシンでプラグインを実行するために使用されているスクリプトです。このスクリプトは、起動したプラグイン(上記の図ではhap2_zabbix_api.pyのBaseMainPlugin)が終了した場合、自動的にプラグインの再起動を行います。プラグインのクラッシュが発生しても自動で復旧するためです。デフォルトの再起動までの待ち時間は10秒です。(※16.04では、この時間は固定で変更できません)
また、再起動の前に当該プロセスグループのすべてのプロセスを終了させます。クラッシュの仕方によっては、いくつかのプロセスが残る場合があるためです。
BaseMainPluginの自動復旧への関わり
図から分かるようにBaseMainPluginも子プロセスを持っています。いずれかの子プロセスが終了した場合、UNIXシグナル(SIGCHLD)が、BaseMainPluginに通知されるので、それを契機に、BaseMainPluginは、実行コンテキスト上でPythonの例外を発生させます。この例外を補足されることなく、そのままプロセスが終了することになります。すると上述したようにhap2_starter.pyがそれを検出して残っているプロセスを終了させます。
まとめ
HAP2プラグインを構成するプロセスの関係を説明しました。いずれかのプロセスが予期せずクラッシュしても、すべてのプロセスが一旦終了し、再起動される仕組みが備えられていることが分かったかと思います。