Практическое задание

Эта задача — шаг 19 курса «Диагностика и восстановление Linux-сервера»

Файл удалили, а место не вернулось

сложно~12 мин

Лог /var/log/svc/big.log удалили, каталог пуст — но место на диске не освободилось: файл всё ещё держит открытым какой-то процесс. На сервере работает несколько фоновых обработчиков, и по списку процессов не видно, какой из них виноват. Найди PID процесса, который держит удалённый файл, запиши его (только число) в /root/holder.txt и заверши только этот процесс — чтобы место вернулось, а остальные обработчики продолжили работу.

Что потренируешь:
  • /proc/PID/fd
  • файловые дескрипторы
  • удалённые файлы
  • kill
  • освобождение места

Разбор темы

Удаление файла (unlink) убирает только имя в каталоге; сами данные живут, пока на inode есть открытые дескрипторы. Поэтому «удалил и не помогло» — нормальное поведение, а не сбой: место вернётся при закрытии последнего дескриптора, то есть при завершении процесса или переоткрытии им файла. Найти держателя можно через /proc/<PID>/fd, где ядро помечает такие цели как (deleted) (то же показывают lsof +L1 и fuser, если они установлены). Отсюда и практика для логов: не rm работающему сервису, а truncate -s 0 или ротация с сигналом переоткрытия — тогда дескриптор остаётся валидным.

Что проверяется

  1. в holder.txt записан PID держателя
  2. удалённый файл больше никем не удерживается
  3. остальные обработчики работают

Как это выглядит