はじめに
【ZABBIX7.0LTS】Linux系Zabbix Agent オフラインインストール でZABBIX-Agentをインストールしたが、OS再起動後、起動しない事象が発生した。原因を調べて解決できたため、ここに備忘録として残したいと思う。
結論
早く対応方法が知りたい方は、根本対応 に飛んでください。
エラー内容
「systemctl start zabbix-agent」を実行すると、下記のエラーが出力された。
どうやら「/run/zabbix/zabbix_agentd.pid」がないから起動に失敗しているようだ。
## 起動失敗
[root@localhost /]# systemctl start zabbix-agent
Job for zabbix-agent.service failed because the service did not take the steps required by its unit configuration.
See "systemctl status zabbix-agent.service" and "journalctl -xe" for details.
[root@localhost /]#
## ジャーナルログ確認
[root@localhost /]# journalctl -xe
~省略~
-- Unit zabbix-agent.service has begun starting up.
## 「/run/zabbix/zabbix_agentd.pid」が探せないって言っている。
11月 25 19:37:14 localhost.localdomain systemd[1]: zabbix-agent.service: Can't open PID file /run/zabbix/zabbix_agentd.pid (yet?) after start: No such file or directory
11月 25 19:37:14 localhost.localdomain systemd[1]: zabbix-agent.service: Failed with result 'protocol'.
-- Subject: Unit failed
-- Defined-By: systemd
-- Support: https://support.oracle.com
--
-- The unit zabbix-agent.service has entered the 'failed' state with result 'protocol'.
11月 25 19:37:14 localhost.localdomain systemd[1]: Failed to start Zabbix Agent.
-- Subject: Unit zabbix-agent.service has failed
-- Defined-By: systemd
-- Support: https://support.oracle.com
--
-- Unit zabbix-agent.service has failed.
--
-- The result is failed.
【 journalctl コマンド 】
inux のシステムログ管理ツールである systemd-journald が記録しているログを表示するためのコマンド。エラーや問題のトラブルシューティング時に役立つ。
オプション -x:エラーの詳細を表示
オプション -e:ログの末尾(最新部分)を表示
オプション -u:特定の systemd ユニットのログを絞り込む
問題個所の確認
実際に「/run/zabbix/zabbix_agentd.pid」が存在するか確認してみる。
やはり、案の定ない…。
[root@localhost /]# ls -la /run/zabbix
ls: '/run/zabbix' にアクセスできません: そのようなファイルやディレクトリはありません
[root@localhost /]#
対応
んじゃ、無いのでディレクトリ作成「/run/zabbix」してしてみる。
作成するとすぐにPIDファイル「zabbix_agentd.pid」が生成された。あれ?
ZABBIX-Agentのサービス状態を確認してみると、失敗していたのが起動している!?
## ディレクトリ作成
[root@localhost /]# mkdir -p /run/zabbix
## この階層を使用するのはZABBIXユーザーのため、所有者変更もすること。(※所有者がrootだとZabbixユーザーが使用できない。)
## 所有者をZABBIXユーザーにする理由は、サービスファイル(systemdの「ユニットファイル (unit file)」)で、サービス実行ユーザーを「ZABBIX」ユーザーに指定しているから。
[root@localhost /]# chown zabbix:zabbix /run/zabbix
[root@localhost /]#
[root@localhost /]# ls -la /run/zabbix
合計 4
drwxr-xr-x 2 zabbix zabbix 60 11月 25 20:00 .
drwxr-xr-x 26 root root 740 11月 25 20:00 ..
-rw-rw-r-- 1 zabbix zabbix 4 11月 25 20:00 zabbix_agentd.pid ←★ すぐに生成された。
[root@localhost /]#
## ZABBIX-Agentのステータス状態(Active)
[root@localhost /]# systemctl status zabbix-agent
● zabbix-agent.service - Zabbix Agent
Loaded: loaded (/etc/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-11-25 20:00:41 JST; 50s ago
Process: 1791 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 3559 ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
Main PID: 3561 (zabbix_agentd)
Tasks: 13 (limit: 5834)
Memory: 112.9M
~省略~
11月 25 20:00:40 localhost.localdomain systemd[1]: Starting Zabbix Agent...
11月 25 20:00:41 localhost.localdomain systemd[1]: Started Zabbix Agent.
[root@localhost /]#
勝手に起動した理由を調べてみると、サービスファイル(systemdの「ユニットファイル (unit file)」)で、サービス起動失敗時に再起動する設定がされていたからだった。
# 失敗時にサービスを再起動
Restart=on-failure
# 再起動するまでの待機時間を10秒に設定
RestartSec=10s
## 10秒おきに起動が実行されている。
~省略~
-- Unit zabbix-agent.service has begun starting up.
11月 25 19:59:41 localhost.localdomain systemd[1]: zabbix-agent.service: Can't open PID file /run/zabbix/zabbix_agentd.pid (yet?) after start: No such file or directory
~省略~
-- Unit zabbix-agent.service has begun starting up.
11月 25 19:59:53 localhost.localdomain systemd[1]: zabbix-agent.service: Can't open PID file /run/zabbix/zabbix_agentd.pid (yet?) after start: No such file or directory
~省略~
念のため最後にOS再起動し、問題なくZABBIX-Agentが起動するか確認する。
再起動後、また「/run/zabbix」が消えており、起動していなかった…。
## ステータス確認
[root@localhost ~]# systemctl status zabbix-agent
● zabbix-agent.service - Zabbix Agent
Loaded: loaded (/etc/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: protocol) since Mon 2024-11-25 20:47:05 JST; 755ms ago
Process: 1318 ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
## ジャーナルログ確認
[root@localhost ~]# journalctl -ex
-- Unit zabbix-agent.service has begun starting up.
11月 25 20:47:05 localhost.localdomain systemd[1]: zabbix-agent.service: Can't open PID file /run/zabbix/zabbix_agentd.pid (yet?) after start: No such file or directory
11月 25 20:47:05 localhost.localdomain systemd[1]: zabbix-agent.service: Failed with result
## ディレクトリ確認
[root@localhost ~]# cd /run/zabbix
-bash: cd: /run/zabbix: そのようなファイルやディレクトリはありません
[root@localhost ~]#
根本原因
「/run」ディレクトリは、一時的なランタイムデータを保存するためのディレクトリであり、メモリ領域(tmpfs:一時ファイルシステム)に作成されるメモリベースの仮想ファイルシステムである。よってOS再起動されると削除されるわけだ。
[root@localhost ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 456M 0 456M 0% /dev
tmpfs 477M 0 477M 0% /dev/shm
tmpfs 477M 6.7M 471M 2% /run ←★ ここ注目!!!
tmpfs 477M 0 477M 0% /sys/fs/cgroup
/dev/mapper/ol-root 17G 3.3G 14G 20% /
/dev/nvme0n1p1 1014M 291M 724M 29% /boot
tmpfs 96M 0 96M 0% /run/user/0
[root@localhost ~]#
根本対応
再起動後も「/run」ディレクトリに作成したものが消えないようにするには、「systemd-tmpfiles」コマンドで設定する必要がある。設定方法は以下の通り。
## 設定ファイル作成
[root@localhost ~]# vi /etc/tmpfiles.d/zabbix-agent.conf
## 設定内容
[root@localhost ~]# cat /etc/tmpfiles.d/zabbix-agent.conf
d /run/zabbix 0755 zabbix zabbix
## 設定適用
[root@localhost ~]# systemd-tmpfiles --create /etc/tmpfiles.d/zabbix-agent.conf
## 適用確認
[root@localhost tmpfiles.d]# systemd-tmpfiles --cat-config
~省略~
# /etc/tmpfiles.d/zabbix-agent.conf
d /run/zabbix 0755 zabbix zabbix
【 systemd-tmpfile 】
Linux システムにおける 一時ファイルやディレクトリを動的に管理するためのツールである。主に /run や /tmp のような一時ディレクトリに存在するデータを管理する役割を持っている。
【 systemd-tmpfiles の動作の設定ファイル 】
以下の設定ファイルでsystemd-tmpfilesの動作を制御する。
/usr/lib/tmpfiles.d/:システムやパッケージのデフォルト設定(設定優先度:低)
/etc/tmpfiles.d/:管理者が設定を追加・上書きするための場所(設定優先度:中)
/run/tmpfiles.d/:一時的な設定(再起動でクリア)(設定優先度:高)
設定を適用するとすぐに「/run」ディレクトリ配下にディレクトリが作成される。
[root@localhost ~]# ls -la /run/zabbix/
合計 4
drwxr-xr-x 2 zabbix zabbix 60 11月 25 21:11 .
drwxr-xr-x 26 root root 740 11月 25 21:11 ..
-rw-rw-r-- 1 zabbix zabbix 4 11月 25 21:11 zabbix_agentd.pid
[root@localhost ~]#
最後にOS再起動して、問題なく「/run/zabbix」ディレクトリが作成されているのとZABBIX-Agentが起動しているのを確認する。
##「/run/zabbix」が問題なく生成されている。
[root@localhost ~]# ls -la /run/zabbix/
合計 4
drwxr-xr-x 2 zabbix zabbix 60 11月 25 21:32 .
drwxr-xr-x 26 root root 740 11月 25 21:32 ..
-rw-rw-r-- 1 zabbix zabbix 3 11月 25 21:32 zabbix_agentd.pid
## ZABBIX-Agentの起動も問題ない。
[root@localhost ~]# systemctl status zabbix-agent
● zabbix-agent.service - Zabbix Agent
Loaded: loaded (/etc/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-11-25 21:32:02 JST; 57s ago
Process: 855 ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
Main PID: 864 (zabbix_agentd)
Tasks: 13 (limit: 5834)
Memory: 6.7M
~省略~
11月 25 21:32:02 localhost.localdomain systemd[1]: Starting Zabbix Agent...
11月 25 21:32:02 localhost.localdomain systemd[1]: Started Zabbix Agent.
[root@localhost ~]#
以上