まだ /usr/lib/systemd/system のサービス設定ファイルを編集しているの?

CentOS7(RHEL)やUbuntu(Debian)などのsystemdでサービス起動している設定ファイル(ユニットファイル)を書き換えるときの注意点をまとめました。

Zabbix-Agentをroot起動したいときに zabbix-agentd.confAllowRoot=1 にしただけじゃ足りず、/usr/lib/systemd/system/zabbix-agent.service で設定しているユーザー、グループを書き換える、ありますよね?

でもその方法、合ってますか?

zabbix root でググると上記のように /usr/lib/systemd/system/zabbix-agent.service を編集するというのが出てきます。

先日、Zabbix-AgentをインストールしてあったCentOS7のサーバでZabbix-AgentとZabbix-getのパッケージをアップデートしました。
アップデート後にサービスは自動的に再起動しているしよしよし、とおもった10分後、アラート発生です。

調べてみるとroot権限がないと読み込めないログファイルの監視に失敗してます。
おやぁ?とおもって ps auxf してみるとzabbix-agentdのプロセスがzabbixユーザーでの実行になってるじゃあ~りませんか。

zabbix-agentd.confAllowRoot は 1 のままなんだけどなぁ、とおもってたんですが、見落としていたのが冒頭のサービス設定ファイルの zabbix-agent.service です。

もしかして、パッケージのアップデートで巻き戻ったか?とおもって調べてみたらBINGO。
/usr/lib/systemd/system/zabbix-agent.serviceが更新されてました。

ここで再び /usr/lib/systemd/system/zabbix-agent.service を書き換えるとまたアップデートしたときに同じことが起きると思ったのでsystemdのサービス設定ファイルについて調べてみました。

RedHatのサイトによるとサービス設定ファイルの読み込み順には優先度があると。

ディレクトリ 説明
/usr/lib/systemd/system/ インストール済みの RPM パッケージで配布された systemd のユニットファイル。
/run/systemd/system/ ランタイム時に作成された systemd ユニットファイル。
このディレクトリーは、インストール済みのサービスのユニットファイルのディレクトリーよりも優先されます。
/etc/systemd/system/ systemctl enable で作成された systemd ユニットファイル、およびサービス拡張向けに追加されたユニットファイル。
このディレクトリーは、runtime のユニットファイルのディレクトリーよりも優先されます。

see: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/introduction-to-systemd_configuring-basic-system-settings

以上の3箇所にサービス設定ファイルが配置されているわけです。
上の表の下から順に優先度が高いわけなので、/usr/lib/systemd/system/の中にあるものがパッケージで更新されてもいいようにするには、/etc/systemd/system/にサービス設定ファイルをコピーして編集する、というのがベストプラクティスかなと。

なので、今回のZabbix-Agentの場合、

となります。
忘れちゃいけないのが、 systemctl daemon-reload です。
これをせずに systemctl restart だけやっても変わらないです。

もし、元のように /usr/lib/systemd/system 以下のもので設定する、ということになれば、コピーした /etc/systemd/system 以下の設定ファイルを削除してから systemctl daemon-reload したら大丈夫ですよ。