
Хорошо, я пытаюсь очистить файл. Это текстовый файл журнала, который пишется непрерывно. Мой ls -lh говорит, что он 3 ГБ
я бегу
> file.log
Мой ls -lh говорит, что все еще 3 ГБ
Однако размер папки, содержащей этот файл, на 3 ГБ меньше. Достаточно странно, подсчет строк говорит, что она не пустая, и я не могу открыть ее в vim (слишком большая).
У меня нет прав администратора, однако я являюсь владельцем файла.
Я попробовал создать новый файл только с первой строкой, чтобы посмотреть, что происходит.
head -1 file.log > first_line.txt
А first_line.txt — 3 ГБ. Это действительно странное поведение.
Вопрос 1: Почему моя первая команда не очищает файл?
Вопрос 2: Как очистить файл, не удаляя его?
Спасибо,
EDIT после комментариев: файл постоянно открывается и записывается другими процессами.
К сожалению, я не могу вмешаться в эти процессы, поэтому не могу временно остановить или перезапустить их.
решение1
ваш файл удерживается процессом, вы не можете его удалить.
используйте lsof file.log
, чтобы узнать, какой процесс в него пишет.
затем
mv file.log old.file.log
перезапустите процесс. (это зависит от процесса).
далее вы сможете удалить old.file.log
.
Если ваш идентификатор файла указан в, /etc/logrotate.d/*
вы можете выполнить команду logrotate.
решение2
Чтобы (почти) очистить файл, используйте команду
echo "" > file.log
Или, если в вашей ОС он есть,
truncate file.log --size 0
Усечет его до 0 байт.
Если в файле нет символов перевода строки, возможно, весь файл состоит из 1 строки, что объясняет размер файла в 3 гигабайта.
Вы можете получить образец файла, используя команду типа
dd if=file.log of=firstpart.txt count=1 bs=200
Что займет первые 200 байт файла. (Если вам нужно больше, увеличьте параметр "bs" до 4096, если вам нужно больше, используйте параметр count, т.е. чтобы получить 8192 блока, count=2 bs=4096)
Совет @Archemar хорош, но я не уверен, что он отвечает на ваши вопросы.