Rm -rf atomik değil mi?


11

Sadece kafa karıştırıcı bir hata yakaladım:

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

Aşağıdaki komutun neden olduğu:

rm -rf $cache_dir/*

nerede $cache_dirolarak tanımlanırxxx/app/cache

Bu yüzden şöyle görüyorum: dir rmiçindeki her şeyi kaldırdı cache/prod, sonra cache/proddizini kaldırmaya çalışmadan hemen önce - başka bir program içinde bir dosya / dizin oluşturdu, bu da rmbaşarısızlığa neden oldu .

Varsayım doğru mu?


7
Varsayımınız doğru - rm -ratomik değil. Çalışırken dizinde başka dosya oluşturulmadığından emin olmak istiyorsanız, önce dosyayı rm -rfyeniden adlandırabilir, ardından yeniden adlandırılan dizini kaldırabilirsiniz.
Johnny

@Johnny: evet, zaten uyguladığım şey bu :-)
zerkms

Bu bile tamamen güvenli değil. Bir uygulama şu anda bu dizinin dışında çalışıyorsa, yalnızca taşıma işlemine devam eder ve normal şekilde çalışmaya devam eder.
Patrick

Bunun rm -rfiş parçacığı güvenli olmasıyla bir ilgisi yoktur : aynı dizinde aynı anda birden çok kez çalıştırırsanız, dizin silinir. Bu rm -ratomik olmamakla ilgili .
Gilles 'SO- kötü olmayı bırak'

@Gilles: şunlara bağlıdır: "Paylaşılan veri yapılarını yalnızca aynı anda birden çok iş parçacığı tarafından güvenli bir şekilde yürütülmesini garanti edecek şekilde değiştirirse bir kod parçası iş parçacığı için güvenlidir". Dolayısıyla, bir rmçağırma olarak "iş parçacığı" olduğunu varsayarsak , iş parçacığı güvenliği hakkında konuşabiliriz. Her neyse, hiçbir şey
değişmiyor

Yanıtlar:


7

ENOTEMPTYVarsayımınız doğru göründüğü için verilen hata mesajı "Dizin boş değil" ( ) idi; bu, bir programın rmdizinden kaldırmaya çalışmadan önce dizinde bir dosya oluşturmaya çalıştığı ENOTEMPTYve temel hatadan beklenen hatayı verdiği bir yarış şartıdır rmdir(2).

NOT: Güvenli tarafta olmak için, dizini yeni bir ada taşıyabilir / yeniden adlandırabilir ve ardından bu dizini silmenizi sağlayabilirsiniz.


2
Bu yanıt yanlıştır, bir dosya kullanımdayken bile dizin girdilerini kaldırabilir ve ardından dizini silebilirsiniz. Basit bir sınama, mkdir x; cat > x/a &; tail -f x/a &; rm -r xdosyalar kullanımdayken bile okuma veya yazma için açık olup olmadıklarına bakılmaksızın bir dizinin kaldırılabileceğini gösterir.
wingedsubmariner

1
Evet, dosyalar hala var, ancak dizinin silinmesinin neden başarılı olmadığıyla ilgisi yok. Cevabınızdaki bu ifade özellikle yanlıştır: "Sistem, içinde bulunan ve okuma / yazma modunda açılan dosyaları olan bir dizini silmez". Cevabınızda bazı iyi şeyler var, sadece soru ile ilgili değil :)
wingedsubmariner

1
Ayrıca, dosya tanımlayıcılarını dosyalarla karıştırmamaya dikkat edin. Dosya tanımlayıcıları hiçbir zaman silinmez, yalnızca kapatılır.
wingedsubmariner

1
İlk paragrafınızın da biraz çalışması gerekebilir. Dosyalar hala açıkken dosya silme işleminin gerçekleşmediği konusunda haklısınız, sadece dosya bu dizinin bağlantısı kaldırıldıktan sonra dizinin silinmesini engellemiyorlar. Evet, bu UNIX'in ilk başta göründüğü kadar garip olduğu gibi herhangi bir dizinde olmayan dosyaların var olmasına izin verdiği anlamına gelir.
wingedsubmariner

1
Gerçekten silme işleminin başarısız olmasının iki nedenini düşünebilirim, OP'nin sezgisi doğruydu ve yeni bir dosya oluşturuldu ya da bir izin hatası. rmizin hataları hakkında şikayetçi, bu yüzden bunu ortadan kaldırabiliriz. Yine de bir cevap gönderecek kadar emin değilim.
wingedsubmariner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.