【なんでも研究日誌】Linux(CentOS7)のテンポラリーファイル(一時ファイル)の自動削除

オープンソースのERP iDempiereでは、レポートの出力処理などにおいて、テンポラリーファイル(以下、一時ファイル)を作成します。

Javaのメソッドを使用して、不要になった一時ファイルを削除するような処理を実装する事は可能ですが、色々な理由ですぐには削除できない場合もあるかと思いますし、file#deleteOnExit()メソッドのように削除するタイミングを、システムの停止処理のタイミングにするような処理もあります。

そのような場合、不要な一時ファイルが溜まってしまいますので、不要な一時ファイルをOSに削除してもらえるように、このコンテンツではCentOS7の一時ファイルの自動削除について調査及び研究し、その成果をまとめています。

CentOS7の一時ファイルの自動削除処理

CentOS6とCentOS7とでは、一時ファイルを削除する仕組みが大きく異なっている様子です。

  • CentOS6まで … tmpwatch
  • CentOS7から … systemd-tmpfiles

違いとして、tmpwatchは、crondから実行されて、atime(最終アクセス日時)で判定していたのが、systemd-tmpfilesは、systemdから実行されて、mtime(最終変更日時)、ctime(inodeの変更日時)、atime(最終アクセス日時)のすべてをチェックするようになった様子です。

iDempiereが使用するテンポラリーデイレクトリ

iDempiereがテンポラリーディレクトリとして使用するディレクトリは下記の手順で確認できます。

iDempiere/JPiereの画面左上にあるロゴをクリックします。

表示されたポップアップウィンドウの、エラータブにある、表示ボタンをクリックします。

表示された「View Log」のポップアップを下にスクロールして行くと、"java.io.tmpdir="とありますので、右辺に設定されている値がテンポラリーデイレクトリです。この画像イメージの場合、”/tmp"になります。

以下、「/tmp」ディレクトリがテンポラリーデイレクトリである事を前提に説明します。

自動削除前のtmpデイレクトリ

しばらく寝せておいたCentOS7を久しぶりに起動して、一時ファイルが格納されているtmpデイレクトリを確認しました。

$ls -al

tmpフォルダの削除前
tmpフォルダの削除前

見積書とか、注文請書という文言が見えますので、iDempiereで出力したレポートのデータが残っているのが確認できます。

ファイルの日時を確認すると、5月4日前ですので、現時点より1ヶ月以上前の日付になっています。

自動削除のタイマー設定確認

$sudo cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer

【結果】

#  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)

 

[Timer]

OnBootSec=15min

OnUnitActiveSec=1d

[hagiwara@centos7-postgresql12 tmp]$ sudo cat /usr/lib/tmpfiles.d/tmp.conf

実行結果のスクリーンショット
実行結果のスクリーンショット

確認した値はデフォルト設定で、下記のような意味との事です。

  • システムが起動してから15分後
  • 前回の実行から1日後(つまり、1日1回実行される)

削除処理の実行コマンドの確認

$ sudo cat /usr/lib/systemd/system/systemd-tmpfiles-clean.service

【実行結果】

#  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

After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target time-sync.target

Before=shutdown.target

 

[Service]

Type=oneshot

ExecStart=/usr/bin/systemd-tmpfiles --clean

IOSchedulingClass=idle

実行結果のスクリーンショット
実行結果のスクリーンショット

自動削除対象フィルの確認

削除対象のファイルは、/usr/lib/tmpfiles.d/tmp.confで指定されています。

$ sudo 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

v /tmp 1777 root root 10d

v /var/tmp 1777 root root 30d

実行結果のスクリーンショット
実行結果のスクリーンショット

これもデフォルト設定で、「/tmp」配下のファイルは"10d"という事で、10日アクセスされている様子が無いと削除される事を意味して、「/var/tmp」配下のファイルは"30d"ということで30日アクセスされている様子が無いと削除される事を意味するようです。

タイマー起動の状態確認

自動削除のタイマー起動の状態を確認します。

$ sudo systemctl status systemd-tmpfiles-clean.timer

実行結果のスクリーンショット
実行結果のスクリーンショット

Active:の行に待機状態であることを示すactive (waiting)が表示されています。 

次回のタイマー起動時間の確認

$ systemctl list-timers

実行結果のスクリーンショット
実行結果のスクリーンショット

自動削除実行後

起動後15分が経過したので、再度「/tmp」デイレクトリを確認した所、ファイルはほとんどなくなっていました。

$ls -al

実行結果のスクリーンショット
実行結果のスクリーンショット