Rm

“rm -rf a/b”說“a/b 不為空”的原因是什麼?

  • June 26, 2019

以下腳本有時會給我類似的東西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

引用自:https://unix.stackexchange.com/questions/12616