Linux

如何在不干擾伺服器的情況下刪除數百萬個文件

  • December 30, 2016

我想刪除一個 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 下並且您希望在螢幕上查看進度,則可以使用這一行。相應地調整睡眠,這樣你就不會過度強調你的硬碟。

引用自:https://serverfault.com/questions/822556