【Linux】/tmpディレクトリにあるファイルが自動で削除されるタイミングっていつ?

tmpディレクトリのファイルが自動で削除タイミングっていつ
この記事を読むと・・・
/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
よかったらシェアしてね!
  • URLをコピーしました!
目次