【ZABBIX7.0LTS】Linux系Zabbix Agent が起動しない。

## はじめに

[【ZABBIX7.0LTS】Linux系Zabbix Agent オフラインインストール](https://qiita.com/ponponpoko/items/4b36734f39aa108e2fc4) でZABBIX-Agentをインストールしたが、OS再起動後、起動しない事象が発生した。原因を調べて解決できたため、ここに備忘録として残したいと思う。

## 結論
早く対応方法が知りたい方は、[根本対応](https://qiita.com/ponponpoko/items/10c378fc5ec356e25823#%E6%A0%B9%E6%9C%AC%E5%AF%BE%E5%BF%9C) に飛んでください。

## エラー内容
「systemctl start zabbix-agent」を実行すると、下記のエラーが出力された。
どうやら「/run/zabbix/zabbix_agentd.pid」がないから起動に失敗しているようだ。


```bash:エラー確認
## 起動失敗
[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.
```

:::note info
【 journalctl コマンド 】
inux のシステムログ管理ツールである systemd-journald が記録しているログを表示するためのコマンド。エラーや問題のトラブルシューティング時に役立つ。

オプション -x：エラーの詳細を表示
オプション -e：ログの末尾（最新部分）を表示
オプション -u：特定の systemd ユニットのログを絞り込む
:::

## 問題個所の確認
実際に「/run/zabbix/zabbix_agentd.pid」が存在するか確認してみる。
やはり、案の定ない…。

```bash:問題個所確認
[root@localhost /]# ls -la /run/zabbix
ls: '/run/zabbix' にアクセスできません: そのようなファイルやディレクトリはありません
[root@localhost /]#

```

## 対応 
んじゃ、無いのでディレクトリ作成「/run/zabbix」してしてみる。
作成するとすぐにPIDファイル「zabbix_agentd.pid」が生成された。あれ？
ZABBIX-Agentのサービス状態を確認してみると、失敗していたのが起動している！？

```bash:ディレクトリ作成
## ディレクトリ作成
[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)」）で、サービス起動失敗時に再起動する設定がされていたからだった。

```bash:/etc/systemd/system/zabbix-agent.service
# 失敗時にサービスを再起動
Restart=on-failure

# 再起動するまでの待機時間を10秒に設定
RestartSec=10s
```

```bash:journalctl -xe
## 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」が消えており、起動していなかった…。
```bash:失敗
## ステータス確認
[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再起動されると削除されるわけだ。

```bash:ファイルシステム確認
[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」コマンドで設定する必要がある。設定方法は以下の通り。

```bash:設定方法
## 設定ファイル作成
[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

```

:::note info
【 systemd-tmpfile 】
Linux システムにおける 一時ファイルやディレクトリを動的に管理するためのツールである。主に /run や /tmp のような一時ディレクトリに存在するデータを管理する役割を持っている。

【 systemd-tmpfiles の動作の設定ファイル 】
以下の設定ファイルでsystemd-tmpfilesの動作を制御する。
/usr/lib/tmpfiles.d/：システムやパッケージのデフォルト設定（設定優先度：低）
/etc/tmpfiles.d/：管理者が設定を追加・上書きするための場所（設定優先度：中）
/run/tmpfiles.d/：一時的な設定（再起動でクリア）（設定優先度：高）
:::

設定を適用するとすぐに「/run」ディレクトリ配下にディレクトリが作成される。

```bash:/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が起動しているのを確認する。

```bash:最終確認
##「/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 ~]#
```

以上