`rm -rf`はアトミックではありませんか?


11

私は紛らわしいエラーをキャッチしました:

rm: cannot remove `xxx/app/cache/prod': Directory not empty

これは次のコマンドによって引き起こされました:

rm -rf $cache_dir/*

どこ$cache_dirのように定義されますxxx/app/cache

だから私はそれを次のように見ていrmます:cache/proddirのすべてを削除してから、それがcache/prodディレクトリを削除しようとする直前-別のプログラムがその中にファイル/ディレクトリを作成したため、rm失敗の原因となりました。

私の仮定は正しいですか?


7
あなたの仮定は正しいです- rm -rアトミックではありません。のrm -rf実行中にディレクトリにファイルが作成されないようにするには、まずファイルの名前を変更してから、名前を変更したディレクトリを削除します。
ジョニー

@ジョニー:うん、それは実際に私が実際に実装したものです:-)
zerkms

それでも完全に安全ではありません。アプリが現在そのディレクトリの外で動作している場合、移動に伴って正常に動作し続けます。
Patrick

これはrm -rfスレッドセーフであることとは関係ありません。同じディレクトリで同時に複数回実行すると、ディレクトリは削除されます。これはrm -rアトミックでないことについてです。
Gilles「SO-邪悪なことをやめなさい」

@Gilles:それは依存します:「コードの一部は、同時に複数のスレッドによる安全な実行を保証する方法で共有データ構造を操作するだけの場合、スレッドセーフです」。したがって、「スレッド」をrm呼び出しとして想定する場合、スレッドセーフについて説明することがあります。しかしとにかく、それは何も変更しません
zerkms 2013年

回答:


7

指定されたエラーメッセージは「ディレクトリが空ではありません」(ENOTEMPTY)でした。これは、想定が正しいように聞こえ、プログラムがディレクトリrmを削除しようとする直前にそのディレクトリにファイルを作成ENOTEMPTYし、基になるから予期されるエラーが発生するという競合状態であるというものですrmdir(2)

注:安全のために、ディレクトリを新しい名前に移動または名前を変更してから、このディレクトリの削除を実行できます。


2
この答えは間違っています。ファイルが使用中であってもディレクトリエントリを削除してから、ディレクトリを削除できます。の簡単なテストはmkdir x; cat > x/a &; tail -f x/a &; rm -r x、ファイルが使用中の場合でも、ファイルが読み取りまたは書き込み用に開いているかどうかに関係なく、ディレクトリを削除できることを示しています。
wingedsubmariner 2013年

1
はい、ファイルはまだ存在していますが、これは、ディレクトリの削除が成功しなかった理由とは関係ありません。あなたの答えのこのステートメントは特に偽です:「システムは、読み取り/書き込みモードで開かれているファイルが存在するディレクトリを削除しません」。あなたの答えにはいくつかの良いものがあります、それは質問に関係していません:)
wingedsubmariner '22

1
また、ファイル記述子とファイルを混同しないように注意してください。ファイル記述子は決して削除されず、クローズされるだけです。
wingedsubmariner 2013年

1
最初の段落にもいくつかの作業が必要な場合があります。ファイルがまだ開いているときにファイルの削除が行われないのは正しいことです。ファイルがそのディレクトリからリンク解除されても、ディレクトリの削除が妨げられないだけです。はい、これは、UNIXがどのディレクトリにも存在しないファイルの存在を許可することを意味します。
wingedsubmariner 2013年

1
削除が失敗する理由は2つだけ考えられます。OPの直感が正しく、新しいファイルが作成されたか、または権限エラーです。rm許可エラーについて不平を言うので、それを排除できると思います。でも、答えを投稿する自信がありません。
wingedsubmariner 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.