Linux: освобождение места после удаления файла

Бывает так, что место на диске закончилось. Ты нашёл виновника — большущий файл на много гигабайт, удалил его rm ./some-big-file.log, а место так и не освободилось. Как так?!

Всё потому что, этот файл всё ещё открыт каким-то процессом и имеется открытый дескриптор этого файла и поэтому файл просто помечен как deleted, но фактически не удалён.

Нужно найти тот самый процесс и перезапустить его или закрыть дескриптор файла:

lsof +L1
или так
lsof | grep deleted

[user@server:/opt/kafka/logs]$ lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
java 1366 user 4r REG 252,1 255986 0 262629 /opt/kafka/log/huge-file.log (deleted)
$ lsof +L1
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NLINK   NODE NAME
java    1366     user   4r   REG  252,1   255986     0 262629 /opt/kafka/log/huge-file.log (deleted)

Видим, что процесс с PID=1366 имеет файловый дескриптор 4 на чтение файла (read)/opt/kafka/log/huge-file.log.
Смотрим информацию по процессу ps -p 1366.
Или более подробно ps -p 1366 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS

Как освободить место

Убить процесс

Если процесс не важный, то его можно остановить принудительно: kill -9 1366

Обнулить файл

В этом случае сам файл останется в файловой системе пока процесс не завершится, но размер файла будет 0 байт и место на диске высвободится.

sudo truncate -s 0 /proc/1366/fd/4
or
> /proc/1366/fd/4

Источник1,Источник2