「systemd-tmpfiles --clean」が機能しないのはなぜですか?

「systemd-tmpfiles --clean」が機能しないのはなぜですか?

一時ファイルをクリーンアップするには、次の設定を使用しました(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内容を見ると/tmp10日を超えるファイルが入っています。

[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-tmpfilesctimemtimeatime

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, Cxおよび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

それがすることは(私は望む)次の通りです:

  1. /foo/tmpatime、mtime、ctimeが7日を超えるファイルとディレクトリを削除します。
  2. 再起動時にコンテンツを削除しないでください。
  3. ディレクトリがない場合は新規作成します(常に存在します)。
  4. ディレクトリの所有権と権限を変更しないでください(モード、UID、GIDはすべてに設定されています-)。

r年齢のためにファイルを削除するために使用されないことは非常に混乱しているようです。マニュアルページから:

age フィールドは、d、D、e、v、q、Q、C、x、X で始まる行にのみ適用されます。

関連情報