systemdを用いた環境で発生するサービス制御に関する問題
systemdを用いた環境で発生するサービス制御に関する問題
問題
当社が提供しているMIRACLE ZBXパッケージにおいて、Red Hat Enterprise Linux 7以降に使用されているsystemdを用いた環境で、下記のエラーが出力されることがあります。
# systemctl status zabbix-agent
...
zabbix-agent.service: Supervising process xxxx
which is not our child. We'll most likely not notice when it exits.
これはsystemdが起動したサービスのプロセス状況を正しく把握できていない状態となります。Zabbix agentに関しては特に影響はないと思われますが、Zabbix server,Zabbix proxyに関しては、systemdの動作上の問題に起因し、サービス終了時にデータを正しく書き出せなくなります。これは、この状態の場合systemdがサービス終了時に、サービスの親プロセスにSIGTERMを送った直後にSIGKILLを投げてしまうためです。なお、バージョン3.0以前のZabbix Server/Proxyでの発生は確認できていません。
対処方法
本問題への対策を行ったパッケージをリリースしました。パッケージのアップデートを行ってください。
MIRACLE ZBX V2.2.x
MIRACLE ZBX 2.2.23-3
https://www.miraclelinux.com/support/miracle-zbx22/zbx-update/20190313
なお、問題が発生している状態でZabbix server, proxyのサービスを停止させるには、下記のようにしなくてはなりません。
(1) systemd設定ファイルを変更する
設定ファイル(/usr/lib/systemd/system/zabbix-server.service)の Restart=always 部を Restart=no に書き換え、systemdに反映させる。
- File:/usr/lib/systemd/system/zabbix-server.service
[Service]
Restart=no
# systemctl daemon-reload
(2) サービスのメインプロセスにSIGTERMを送る
# kill -TERM `cat /var/run/zabbix/zabbix_server.pid`
システム規模により停止時間は異ります。下記のように、ログを出力して進行状況を確認してください。(終了するには、Ctl-cを実行します。)
# tail -f /var/log/zabbix/zabbix_server.log
正常に終了すると最終行に以下の表示が出ます。(終了するには、Ctrl+Cを実行します。)
Zabbix Server stopped. Zabbix x.x.x-x (revision xxxxx).
上記の方法で正常終了しない場合は下記を行います。
(1) サービスのメインプロセスへSIGKILLを送る
# kill -KILL `cat /var/run/zabbix/zabbix_server.pid`
(2) Pollerプロセス等へSIGKILLを送る
- 下記コマンドでPIDを確認してください。(複数出力されます。)
# ps aux|grep -v grep | grep "zabbix_server: poller" | awk '{print $2}'
# kill -KILL PID
(3) History Syncerプロセスが書き出しをしなくなったことを確認して、サービスを停止させる
# systemctl stop zabbix-server