オープンソースの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
見積書とか、注文請書という文言が見えますので、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