PrivateTmpとは
systemdのUnit定義にてPrivateTmp
をyes
もしくは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
上記のようにPrivateTmp
にyes
を指定する。
ファイルを直接作成した場合はsystemd
に認識されないので以下のコマンドを実行する。
$ sudo systemctl daemon-reload
実行するコード
実行するコードは以下の通り。10秒ごとに1回/tmp/hello.txt
へhello
と書き込む。
#!/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
\第一線のプログラマーの行動原理を学べる!/