Случается так, что место на Linux сервере заканчивается. Админу нужно срочно удалить что-нибудь большое и ненужное. Админ находит кандидата на удаление, удаляет его, и... место не освобождается. Как быть?
Вот так и у меня неожиданно на выходных на сервере закончилось место. Быстро проверяю процент использования дисков:
df -h
Два диска забиты на 100%. Печаль, почищу сначала первый диск. Нахожу большой ненужный файл под названием cloud_api_ru.log, терабайт так на восемь, удаляю его, а диск как был забит на 100%, так и остался.
Получается, что файл только пометился на удаление и в настоящий момент открыт какой-то программой. Сервер перезагрузить нельзя, а место нужно освобождать прямо сейчас.
Узнаю номер процесса, который держит файл открытым:
lsof | grep имя_файла
Итак, файл держит rsyslog с идентификатором процесса 1752. Засада. rsyslog я не могу кильнуть в данный момент. Но я могу найти символьную ссылку на файловый дескриптор и стереть содержимое файла:
ls -l /proc/идентификатор_процесса/fd | grep имя_файла
ls -l /proc/1752/fd | grep cloud
Получаю:
l-wx------ 1 root root 64 окт. 16 11:22 12 -> /путь_к_файлу
Где 12 — это дескриптор.
Ссылка на удалённый файл:
/proc/идентификатор_процесса/fd/дескриптор
Стираю содержимое файла:
cat /dev/null > /proc/идентификатор_процесса/fd/дескриптор
cat /dev/null > /proc/1752/fd/12
Проверяю место:
df -h
Место освободилось. Файл всё ещё открыт процессом rsyslog, в него продолжают записываться свежие данные, но основное содержимое уже стёрто.
Наученный горьким опытом, на втором диске я буду не удалять подобные файлы, а стирать их содержимое:
cat /dev/null > /путь_к_файлу