Linux
如何在不干擾伺服器的情況下刪除數百萬個文件
我想刪除一個 nginx 記憶體目錄,我通過以下方式快速清除了該目錄:
mv cache cache.bak mkdir cache service nginx restart
現在我有一個
cache.bak
包含 200 萬個文件的文件夾。我想刪除它,而不打擾伺服器。一個簡單
rm -rf cache.bak
的垃圾伺服器,即使是最簡單的 HTTP 響應在 rm 執行時也需要 16 秒,所以我不能這樣做。我試過
ionice -c3 rm -rf cache.bak
了,但沒有幫助。伺服器有一個 HDD,而不是 SSD,可能在 SSD 上,這些可能不是問題。我相信最好的解決方案是某種節流,就像 nginx 的內置記憶體管理器一樣。
你會如何解決這個問題?有什麼工具可以做到這一點嗎?
Ubuntu 16.04 上的 ext4
製作一個這樣的 bash 腳本:
#!/bin/bash rm -- "$*" sleep 0.5
deleter.sh
例如,用名稱保存它。執行chmod u+x deleter.sh
使其可執行。該腳本刪除所有作為參數傳遞給它的文件,然後休眠 0.5 秒。
然後,您可以執行
find cache.bak -print0 | xargs -0 -n 5 deleter.sh
此命令檢索 cache.bak 中所有文件的列表,並一次將五個文件名傳遞給刪除腳本。
因此,您可以調整一次刪除多少文件,以及每次刪除操作之間的延遲時間。
您應該考慮將記憶體保存在單獨的文件系統上,您可以按照評論中的說明進行掛載/解除安裝。
/usr/bin/find /path/to/files/ -type f -print0 -exec sleep 0.2 \; -exec echo \; -delete
在您這樣做之前,假設您的 find 二進製文件位於 /usr/bin 下並且您希望在螢幕上查看進度,則可以使用這一行。相應地調整睡眠,這樣你就不會過度強調你的硬碟。