Saya baru saja menemukan kesalahan yang membingungkan:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
yang disebabkan oleh perintah berikut:
rm -rf $cache_dir/*
dimana $cache_dir
didefinisikan sebagaixxx/app/cache
Jadi saya melihatnya seperti: rm
menghapus semuanya dalam cache/prod
dir, lalu tepat sebelum mencoba untuk menghapus cache/prod
direktori - program lain membuat file / direktori di dalamnya sehingga menyebabkan rm
kegagalan.
Apakah asumsi saya benar?
rm -r
bukan atom. Jika Anda ingin memastikan bahwa tidak ada lagi file yang dibuat di direktori saatrm -rf
sedang berjalan, Anda bisa mengganti nama terlebih dahulu, lalu menghapus direktori yang diubah namanya.rm -rf
menjadi aman utas: jika Anda menjalankannya beberapa kali secara bersamaan di direktori yang sama, direktori tersebut akan dihapus. Ini tentangrm -r
tidak menjadi atom.rm
doa, kita dapat berbicara tentang keamanan utas. Tapi bagaimanapun, itu tidak mengubah apa punJawaban:
Pesan kesalahan yang diberikan adalah "Direktori tidak kosong" (
ENOTEMPTY
), mengingat ini asumsi Anda terdengar benar, bahwa itu adalah kondisi ras di mana program membuat file di direktori itu sebelumrm
mencoba untuk menghapus direktori, memberikanENOTEMPTY
kesalahan yang diharapkan dari yang mendasarinyarmdir(2)
.CATATAN: Untuk berada di sisi aman Anda bisa memindahkan / mengganti nama direktori ke nama baru, dan kemudian jalankan penghapusan direktori ini.
sumber
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
menunjukkan bahwa direktori dapat dihapus bahkan ketika file sedang digunakan, terlepas dari apakah mereka terbuka untuk membaca atau menulis.rm
mengeluh tentang kesalahan izin, jadi saya pikir kita bisa menghilangkannya. Saya tidak cukup percaya diri untuk mengirim jawaban.