PrivateTmpとは

systemdのUnit定義にてPrivateTmpyesもしくはtrueにすると、/tmpディレクトリ以下にsystemd-private-サービス名-UUIDというディレクトリが作成され、そのディレクトリ以下にtmpディレクトリが作成される。

つまり、/tmp/systemd-private-サービス名-UUID/tmpというディレクトリが作成され、そのサービスから起動されるプロセスにおける/tmpディレクトリはこのディレクトリになる。

PrivateTmpの動作確認

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

サービス定義

以下のようなサービスを作成する。

[Unit]
Description = hello

[Service]
ExecStart = /root/hello.sh
Restart = always
Type = simple
PrivateTmp=yes # ここ

[Install]
WantedBy = multi-user.target

上記のようにPrivateTmpyesを指定する。

ファイルを直接作成した場合はsystemdに認識されないので以下のコマンドを実行する。

$ sudo systemctl daemon-reload

実行するコード

実行するコードは以下の通り。10秒ごとに1回/tmp/hello.txthelloと書き込む。

#!/bin/bash

while true; do
  # /tmp 以下に書き込む
  echo "hello" > /tmp/hello.txt
  sleep 10
done

サービスを起動して書き込まれたファイルを確認する

作成したサービスを起動する。

$ sudo systemctl start hello

専用のフォルダを確認する。

$ ls /tmp | grep hello
systemd-private-47ffb72fa9414e8aabb8509537e44edf-hello.service-AIviC2

$ cd /tmp/systemd-private-47ffb72fa9414e8aabb8509537e44edf-hello.service-AIviC2
$ tail -f ./tmp/hello.txt
hello
hello
hello
hello
hello

上記のように/tmp直下ではなく、専用のフォルダ内に書き込まれているのが確認できる。

再起動するとフォルダが変わる

サービスを再起動するとUUIDが変わるので、フォルダも変わる。

$ ls /tmp | grep hello
systemd-private-47ffb72fa9414e8aabb8509537e44edf-hello.service-AIviC2
$ sudo systemctl restart hello
$ ls /tmp | grep hello
systemd-private-47ffb72fa9414e8aabb8509537e44edf-hello.service-0hX5sO