Rm
“rm -rf a/b”說“a/b 不為空”的原因是什麼?
以下腳本有時會給我類似的東西
can't remove a/b as it's not empty
ssh -T user@host <<EOF cd somewhere rm -rf a/b EOF
但是我登錄到伺服器並執行
rm -rf a/b
然後我從來沒有遇到過問題。還有其他程序正在生成文件
a/b
,這是否相關?無論如何,如何製作一個腳本來確保“a/b”將被刪除?
rmdir(2)
如果目錄不為空,將失敗。如果另一個程序在刪除文件時正在創建文件rm(1)
,它將不知道刪除它們,因此當rm(1)
需要嘗試刪除它認為應該是空目錄的內容時,它將失敗並顯示您發布的錯誤。面對目錄中的並發文件創建刪除目錄的一種方法是重命名它:
mv a a~ rm -rf a~
a/b
如果創建文件的程序不是通過路徑(open(2)
vs. )這樣做,這可能不起作用openat(2)
。我假設在其中創建文件的程序
a/b
將重新創建該目錄,如果它不存在,或者如果它不存在,將優雅地處理失敗。由於您已經嘗試從其他程序下刪除目錄,這似乎是一個安全的假設。
還有其他程序正在向 a/b 生成文件,這有關係嗎?
很有可能。可能是
rm -rf
首先刪除所有文件,然後刪除所有目錄。在後台,rmdir
如果目錄不為空,則刪除目錄的系統呼叫將失敗。您可能會遇到競爭條件,rm -rf
檢查目錄是否為空,並且它是;然後另一個程序創建一個新文件;finallyrm -rf
呼叫rmdir
,但另一個程序事先創建了一個文件。Faheem 的建議是好的:
ls
在你的錯誤條件中加入一個ssh -T user@host <<EOF cd somewhere rm -rf a/b || ( ls -a a/b && exit 1 ) EOF