削除が並行して発生すると、rm -rf は失敗します。

削除が並行して発生すると、rm -rf は失敗します。

rm -rf同じファイルツリーを削除しようとすると失敗します(rmファイルが最初に列挙されてから削除されるため)。

簡単なテスト:

# Terminal 1
for i in `seq 1 1000`; do mkdir -p /tmp/dirtest/$i; done

# Now at the same time in terminal 1 and 2
rm -rf /tmp/dirtest

たとえば、stderrのいくつかの出力があります。

...
rm: cannot remove directory `/tmp/dirtest/294': No such file or directory
rm: cannot remove directory `/tmp/dirtest/297': No such file or directory
rm: cannot remove directory `/tmp/dirtest/304': No such file or directory

すべてのstderr出力をリダイレクトして無視できますが、/dev/null削除は/tmp/dirtest実際に失敗します!両方のコマンドが完了した後も/tmp/dirtestまだ存在します。

rmディレクトリツリーを正しく削除し、実際にすべてのエラーを無視する方法は?

答え1

くそー。ただし、ある意味では、2つの同時プロセスがディレクトリツリーを操作するときに問題が発生するということです。 Unixは個々のファイルのアトミック操作のための基本的な要素を提供しますが、ディレクトリツリー全体では提供されません。

簡単な回避策は、スクリプトを削除する前にディレクトリの名前を変更することです。ユースケースには共同作業スクリプトがあるため、新しい名前を予測できます。

mv /build/tree /build/tree.rm.$$
mkdir /build/tree
rm -rf /build/tree.rm.$$

rmおそらく、ビルドがCPU集約的なタスクを実行している間は、後でバックグラウンドでこれを実行できます。

答え2

ビルドシステムがどのようにこのようになったのか疑問に思います。変更できますか?少なくとも、他のスクリプトがすでにタスクを実行していることをスクリプトに通知するフラグを作成できます。

mkdir /tmp/flag.rmdirtest && rm -rf /tmp/dirtest && rmdir /tmp/flag.rmdirtest

必要がないように再構築することをお勧めします。

関連情報