В Linux иногда можно столкнуться с тем, что после удаления файла на диске не освобождается свободное место. Это связано с тем, что если данный файл занят (используется) каким-то процессом, то дескриптор файла не освобождается пока процесс не освободит его.
Рассмотрим, что делать в таком случае, когда нужно освободить место на диске. В нашем примере на разделе почти не осталось свободного места:
# df -h
С помощью следующей команды можно найти топ 10 больших файлов в Linux:
# du -ahx / | sort -rh | head -10
Например, вы определили, что самый большой файл /var/log/mysql/error.log. Удалите его:
# rm -rf /var/log/mysql/error.log
Однако удаление файла не высвободит занятое место. Файл был просто помечен как deleted, но фактически не был удален.
Определим какой процесс использует удаленный файл:
# lsof | grep deleted | grep error.log
Процесс используется службой mariadb. Остановить или перезапустить этот процесс в данный момент нельзя, т.к. он обслуживает продуктивные базы данных.
Зная идентификатор процесса PID 4441, можно получить номер файлового дескриптора удаленного файла:
# ls -l /proc/4441/fd | grep error.log
В данном примере 200 это файловый дескриптор.
Чтобы освободить место, нужно стереть содержимое файла, указав PID процесса и файловый дескриптор:
# > /proc/4441/fd/200
Проверьте, что место на диске освободилось.
Вообще говоря, лучше взять за правило (это особо касается log файлов), что вместо их удаления, лучше очищать их содержимое:
# truncate -s 0 /var/log/mysql/error.log
Такая команда обрежет файл до нулевого размера, не удаляя его (процесс, который использует файл продолжит работу с ним).