この記事を読むと・・・ |
---|
/tmpディレクトリにあるファイルの削除タイミングが理解できる /tmpディレクトリに置いた一時的なファイルがいつの間にか消えてしまう仕組みが理解できる |
前提条件
クラウド環境のOSやバージョンによって/tmpディレクトリにあるファイルを削除する仕組みが異なるので、今回の実施した環境を以下に記載します。
- 環境:VirtualBox上の仮想マシン
- OS:Red Hat Enterprise Linux release 9.1
systemd-tmpfiles-clean.timer
まずは「systemd-tmpfiles-clean.timer(タイマーユニット)」について確認していきます。
systemd-tmpfiles-clean.timer の設定確認
/tmpディレクトリにあるファイルが削除される理由を紐解くために、最初に確認したいファイルは「systemd-tmpfiles-clean.timer」です。
これはタイマーユニット(.timer)の1つで、サービスユニット(.service)を制御することができます。
ファイルの中身を確認するため、cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
コマンドを実行します。
注目してほしい箇所は17行目と18行目です。
17行目:OnBootSec=15min
18行目:OnUnitActiveSec=1d
つまり、起動してから15分後に実行され、それ以降はアクティブになっているので1日ごとに実行しますという条件が記載されています。
# cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
ConditionPathExists=!/etc/initrd-release
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
systemd-tmpfiles-clean.timer の起動状態確認
タイマーユニット(.timer)を使用する場合は、起動状態が「active」である必要があります。
起動状態は、systemctl status systemd-tmpfiles-clean.timer
コマンドで確認できます。
4行目の「Active:」を確認することで起動状態が確認できます。
表示(Active:) | 状態 |
---|---|
active | 起動中 |
inactive | 停止中 |
# systemctl status systemd-tmpfiles-clean.timer
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static)
Active: active (waiting) since Mon 2023-02-27 22:35:37 JST; 1h 16min ago
Until: Mon 2023-02-27 22:35:37 JST; 1h 16min ago
Trigger: Tue 2023-02-28 22:50:48 JST; 22h left
Triggers: ● systemd-tmpfiles-clean.service
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
2月 27 22:35:37 RHEL9 systemd[1]: Started Daily Cleanup of Temporary Directories.
systemd-tmpfiles-clean.service
続いては「systemd-tmpfiles-clean.service(サービスユニット)」について確認していきます。
systemd-tmpfiles-clean.service の設定確認
先ほどのタイマーユニットの条件で呼び出されるサービスがこの「systemd-tmpfiles-clean.service」です。
ファイルの中身を確認するため、cat /usr/lib/systemd/system/systemd-tmpfiles-clean.service
コマンドを実行します。
注目してほしい箇所は21行目です。
21行目:ExecStart=systemd-tmpfiles –clean
つまり、サービス起動時に「systemd-tmpfiles –clean」コマンドを実行しますということが記載されています。
このコマンドが実行されるときに「/usr/lib/tmpfiles.d/tmp.conf」という設定ファイルが読み込まれ、その条件に従って/tmpディレクトリにあるファイルが削除されています。
これが/tmpディレクトリにあるファイルが削除される原因です。
※この設定ファイルについてはこのあと説明しています。
# cat /usr/lib/systemd/system/systemd-tmpfiles-clean.service
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target initrd-switch-root.service
After=local-fs.target time-set.target
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=systemd-tmpfiles --clean
SuccessExitStatus=DATAERR
IOSchedulingClass=idle
systemd-tmpfiles-clean.service の起動状態確認
サービスユニット(.service)を使用する場合は、タイマーユニット(.timer)と同様に起動状態が「active」である必要があります。
起動状態は、systemctl status systemd-tmpfiles-clean.service
コマンドで確認できます。
4行目の「Active:」を確認することで起動状態が確認できます。
表示(Active:) | 状態 |
---|---|
active | 起動中 |
inactive | 停止中 |
# systemctl status systemd-tmpfiles-clean.service
○ systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static)
Active: inactive (dead) since Mon 2023-02-27 22:50:48 JST; 1h 2min ago
TriggeredBy: ● systemd-tmpfiles-clean.timer
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 1145 ExecStart=systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
Main PID: 1145 (code=exited, status=0/SUCCESS)
CPU: 12ms
2月 27 22:50:48 RHEL9 systemd[1]: Starting Cleanup of Temporary Directories...
2月 27 22:50:48 RHEL9 systemd[1]: systemd-tmpfiles-clean.service: Deactivated successfully.
2月 27 22:50:48 RHEL9 systemd[1]: Finished Cleanup of Temporary Directories.
/usr/lib/tmpfiles.d/tmp.conf の設定確認
systemd-tmpfilesコマンドが実行されたときに読み込まれる設定ファイルが「/usr/lib/tmpfiles.d/tmp.conf」です。
ファイルの中身を確認するため、cat /usr/lib/tmpfiles.d/tmp.conf
コマンドを実行します。
注目してほしい箇所は12行目です。
12行目:q /tmp 1777 root root 10d
つまり、/tmpディレクトリが存在しなければパーミッション「1777」、所有者「root root」で作成し、すでに存在する場合は/tmpディレクトリにある10日以上経過したものを削除するという動作が定義されています。
つまり、この設定ファイルにより/tmpディレクトリにあるファイルが削除されるタイミングが決定しています。
# cat /usr/lib/tmpfiles.d/tmp.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d