Если процесс уже открыл файл, его можно удалить из каталога:
exec {LOG}>/tmp/debug.log
rm /tmp/debug.logИмя
/tmp/debug.log исчезнет, и открыть файл по этому пути уже нельзя. Но Bash продолжает держать открытый файловый дескриптор, поэтому запись работает:printf '%s\n' "debug message" >&"$LOG"
Причина в семантике Unix:
rm удаляет имя файла из каталога через unlink(), а открытый файловый дескриптор продолжает ссылаться на тот же объект файловой системы.Пока дескриптор открыт, занятое файлом место также не освобождается. Это объясняет распространённую ситуацию, когда огромный лог уже удалили,
ls его не показывает, а свободного места на диске не прибавилось.Закрываем последний дескриптор:
exec {LOG}>&-Если других ссылок и открытых дескрипторов на этот файл больше нет, файловая система сможет освободить его данные.
Именно поэтому при расследовании занятого диска стоит искать не только большие файлы, но и уже удалённые файлы, которые продолжают удерживать работающие процессы.
🔥 В Linux имя файла и открытый файл — не одно и то же. Понимание этой особенности помогает находить утечки дискового пространства и аккуратно работать с временными данными.
🚪 Linux Ready | #совет
