Бывает так, что место на диске закончилось. Ты нашёл виновника — большущий файл на много гигабайт, удалил его 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