/run (/var/run) 配下のxxxxxディレクトリーが消えている。

/run (/var/run) 配下のディレクトリは、プログラムが実行された時にsocketファイルやpidファイルが作成される。
しかし、このディレクトリが何らかの理由により作成されていない場合や、作成されていてもディレクトリの権限と配下にファイルを作成するユーザー権限の違いにより、ファイルが作成されない場合がある。
構築段階ではrootで実行していたものを、専用ユーザーで実行するように変更した場合に陥りやすいので注意が必要である。

著者はasteriskでこの事象に遭遇。
/var/run/asterisk ディレクトリは作成されていたが、 root:asterisk となっており、asterisk実行ユーザーは"asterisk" であった為、asterisk.ctl asterisk.pid が作成されていなかった。

解決手法は大きく2通り

  • systemd-tmpfiles-setup.service での制御
  • 各プログラムを起動するserviceファイル内で権限を指定する

【systemd-tmpfiles-setup.service での制御】

※前提条件:systemd-tmpfiles-setup.serviceを自動起動していること

/etc/tmpfiles.d 配下にasterisk.confを作成し、以下1行を書く。

d /run/asterisk 0775 asterisk asterisk


【各プログラムを起動するserviceファイル内で指定する】

青文字のRuntimeDirectory/RuntimeDirectoryModeで指定する
ファイルは /lib/systemd/system/asterisk.service となるが、アップデート時にデフォルト状態に戻る可能性も否めない為、systemctl edit asterisk.service で編集するのがbetterである。
※ /etc/systemd/system/asterisk.service.d/override.conf として保存される

[Unit]
Description=Asterisk PBX and telephony daemon.
After=network.target

[Service]
Type=simple
Environment=HOME=/var/lib/asterisk
WorkingDirectory=/var/lib/asterisk
RuntimeDirectory=asterisk
RuntimeDirectoryMode=0775

User=asterisk
Group=asterisk
ExecStart=/opt/local/sbin/asterisk -mqf -C /etc/asterisk/asterisk.conf
ExecReload=/opt/local/sbin/asterisk -rx 'core reload'

LimitCORE=infinity
Restart=always
RestartSec=4
StandardOutput=null
PrivateTmp=true

[Install]
WantedBy=multi-user.target