RuntimeDirectoryとは

systemdのUnit定義にてRuntimeDirectoryを指定すると、/run/以下に指定した名前のディレクトリが自動作成される。

サービスの起動時に作成され、停止時に削除される。PIDファイルやソケットファイルなどのランタイムファイルの格納先として利用する。

使い方

[Service]セクションにRuntimeDirectoryを指定する。

[Unit]
Description = myapp

[Service]
ExecStart = /usr/bin/myapp
Type = forking
RuntimeDirectory = myapp
PIDFile = /run/myapp/myapp.pid

[Install]
WantedBy = multi-user.target

RuntimeDirectory=myappを指定すると、サービス起動時に/run/myapp/が自動で作成される。PIDFileと組み合わせることで、PIDファイルを/run/以下のサービス専用ディレクトリに配置できる。

動作確認

簡単なサービスを作成して動作を確認する。

サービスを定義する

[Unit]
Description = app1

[Service]
ExecStart = /bin/sleep infinity
Restart = no
Type = simple
RuntimeDirectory = myapp

[Install]
WantedBy = multi-user.target

ファイルを直接作成した場合は、systemdへ認識させるために以下のコマンドを実行する。

$ sudo systemctl daemon-reload

起動してディレクトリを確認する

$ sudo systemctl start app1
$ ls -la /run/myapp/
drwxr-xr-x  2 root root  40 Jun 19 13:15 .
drwxr-xr-x 12 root root 300 Jun 19 13:15 ..

/run/myapp/が自動で作成されていることを確認できる。

停止してディレクトリを確認する

$ sudo systemctl stop app1
$ ls /run/myapp/
ls: cannot access '/run/myapp/': No such file or directory

サービスを停止すると/run/myapp/が自動で削除される。

注意点: 複数のサービスが同じRuntimeDirectoryを指定した場合

複数のサービスが同じRuntimeDirectoryを指定している場合、片方のサービスを停止するとディレクトリごと削除される

例えば、app1.serviceapp2.serviceが同じRuntimeDirectory=myappを指定しているとする。

[Service]
RuntimeDirectory = myapp
[Service]
RuntimeDirectory = myapp

両方を起動した状態でapp1を停止すると、app2がまだ動いているにもかかわらず/run/myapp/が削除される。

$ sudo systemctl start app1
$ sudo systemctl start app2
$ ls /run/myapp/
drwxr-xr-x  2 root root 40 Jun 19 13:19 .
drwxr-xr-x 12 root root 300 Jun 19 13:19 ..

$ sudo systemctl stop app1
$ ls /run/myapp/
ls: cannot access '/run/myapp/': No such file or directory

app2は動いているままだが、/run/myapp/は削除されている。同じRuntimeDirectoryを複数のサービスで共有する場合はこの挙動に注意が必要である。

ファイルを共有する必要がなければ、それぞれ別のディレクトリ名を指定するのが安全である。