一時ファイルをクリーンアップするには、次の設定を使用しました(CentOS 7の場合はデフォルト)。これは/tmp
、ファイルが10日より古い場合は削除する必要があることを示します。
[root]# tail -n +10 /usr/lib/tmpfiles.d/tmp.conf | head -n 3
# Clear tmp directories separately, to make them easier to override
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
ところで実行してからもsystemd-tmpfiles --clean
内容を見ると/tmp
10日を超えるファイルが入っています。
[root]# ls -dl /tmp/backup-inspection
drwxr-xr-x 8 root root 68 Aug 29 2014 /tmp/backup-inspection
このディレクトリの内容は/tmp
かなり大きいです。
[root]# du -h /tmp | tail -n 1
3.5G /tmp
backup-inspection
このディレクトリが削除されない理由を説明できる人はいますか?すでにほぼ1歳になりましたか?
答え1
最近、同じ問題に直面してこの問題を発見し、経験を共有しています。
実際には、systemd-tmpfiles
期待どおりに再帰ディレクトリツリー処理が完全にサポートされています(他の答えはソースコードを確認するのに十分混乱しています)。私の場合、atime
ファイルが削除されない理由は。systemd-tmpfiles
ctime
mtime
atime
systemd-tmpfiles
実際には、ファイルをスキップするための内部ルールが多いため、他の理由がある可能性があります。一部のファイルが削除されなかった理由を確認するには、systemd-tmpfiles
次のコマンドを実行します。
env SYSTEMD_LOG_LEVEL=debug systemd-tmpfiles --clean
コンソールに多くの出力をダンプできます。stdout
たとえば、ファイルにリダイレクトしようとすると、出力は消えてsystemdログに送信されます(たとえば、経由で取得できますjournalctl
)。私の場合は、出力も途中で切り捨てて(または使い方を知らなかったためjournalctl
)、ターミナルエミュレータの履歴バッファを一時的に増やすことが解決策でした。
答え2
最近、私は私の権限に基づいてサーバー上の同様の問題を解決するために最善を尽くしてきました。
簡単な答えは基本的には次のとおりです。systemd-tmpfiles --clean
めちゃくちゃ、代替案を探すべきだ
あまり簡単ではない答えは少し長いです。
systemd-tmpfiles
さまざまなタスクを実行しますが、デフォルトのタスク--clean
はオプションとは関係ありません。つまり、再起動時にシステムの状態が適切に「リセット」されていることを確認します。つまり、さまざまな理由で存在しなければならないディレクトリとファイルが生成され、存在してはいけないディレクトリとファイルが削除されることを保証します(ファイルシステムサブボリュームとクォータの作成、ブロックデバイスの作成などの比較的難解なエントリの長いリストとともに) 。など)、権限の変更、SELinux属性などの内容が気になる方は、マンページを参照してsystemd-tmpfiles --create
くださいsystemd-tmpfiles --remove
。これら 2 つのサブコマンドは、各構成行の先頭を大まかに考慮します。最初のフィールドはジョブの種類、2番目のフィールドはターゲット、3番目のフィールドはモードなどです。通常、このようなタスクは、systemd-tmpfiles --create --remove
システムが起動した直後に実行するタスクによって異なる可能性があるタスクが実行される前に実行されます。 1つの重要な点は、これらの操作では5番目のパラメータであるAgeパラメータをチェックしないことです。これが--clean
入ってくるところです。
systemd-tmpfiles --clean
デフォルトでは、追加フィールド(Ageフィールド)を使用してこのインフラストラクチャに乗り換えます。ただし、他のサブコマンドd, D, v, q, Q, C
、x
およびX
(クリーンアップから特定の項目を除外するために存在する)によって実行される特定の種類の操作のみを考慮してください。これらの一般的なユースケースに関連する唯一のものは、d
それぞれD
ディレクトリの場合はcreate-if-doesn't-existとcreate-if-doesn't-exist-or-emptying-if-it-doesです。年齢を表示した後、systemd-tmpfiles --clean
年齢が設定されているよりも古い場合は、リストされているパスが削除されます。
問題は、これが実際に何を意味するのかです。リストされたパスのみ- 年齢タグはフォルダの内容に繰り返し適用されません。言い換えれば、あなたの質問の構成行は、全体または/tmp
、/var/tmp
そしてそれぞれが10日または30日間何も起こらなかった場合にのみ削除されることを意味します。スノーモーダルとしてx
年齢に影響を与える要因のうち、それ以外はグローバルをサポートする要因はありませんX
。入らないようにする整理中のもの。
マンページには、tmpfiles.d
運が良ければ適用できる興味深い内容がリストされています。 "ageフィールドがチルダ文字"〜"で始まる場合、クリーンアップは指定されたディレクトリとディレクトリ内の1レベル内のファイルにのみ適用されますが、その中のファイルとディレクトリはそうではありません。 - 私の場合は、次の2つのレベルでクリーンアップを実行しなければ/tmp
ならなかったため、良い効果を発揮できませんでした。
今までのように最後まで縛られておらず、ディレクトリの内容を主な目的として扱う他の解決策を/tmp
見つけてくださいsystemd-tmpfiles --clean
。
答え3
d
ディレクトリの作成に使用されますr
ファイル削除用
からtempfiles.d(5)
。他は必要ありません。以下を試してください。
d /tmp 1d
d
Create a directory if it does not exist yet.
D
Create or empty a directory.
r
Remove a file or directory if it exists. This may not be used to
remove non-empty directories, use R for that. Lines of this type
accept shell-style globs in place of normal path names. Does not
follow symlinks.
R
Recursively remove a path and all its subdirectories (if it is a
directory). Lines of this type accept shell-style globs in place
of normal path names. Does not follow symlinks.
答え4
私もこの問題で長い間悩んだ。
私の状況は、7日間使用されていないファイルを削除する必要があるカスタムtmpディレクトリ(カスタムアプリケーションに必要で高速なSSDディスクに配置されている)があることです。
結局のところ、私がしたことは、/etc/tmpfiles.d
「foo.conf」というファイルの中に次の行を含むファイルを作成することでした。
d /foo/tmp - - - 7d
それがすることは(私は望む)次の通りです:
/foo/tmp
atime、mtime、ctimeが7日を超えるファイルとディレクトリを削除します。- 再起動時にコンテンツを削除しないでください。
- ディレクトリがない場合は新規作成します(常に存在します)。
- ディレクトリの所有権と権限を変更しないでください(モード、UID、GIDはすべてに設定されています
-
)。
r
年齢のためにファイルを削除するために使用されないことは非常に混乱しているようです。マニュアルページから:
age フィールドは、d、D、e、v、q、Q、C、x、X で始まる行にのみ適用されます。