5

Я пытаюсь усечь файл, используемый для перенаправленного стандартного вывода. Например:

ping localhost>/tmp/test.log

Если я вызываю rm /tmp/test.log перенаправление прекращается, но команда работает.

Если я вызываю truncate -s0 /tmp/test.log или >/tmp/test.log или echo .. и т.д., Перенаправление работает, но файл содержит начальные нули, потому что позиция потока не изменилась.

Как я могу обрезать файл?

2 ответа2

3

Вы должны понимать файловые системы Unix, прежде чем сможете ответить на этот вопрос.

Единственное, что делает rm , это стирает имя файла, фактически указатель с вашей структуры каталогов на блоки диска.

Когда ты бежишь

ping localhost > /tmp/test.log
rm /tmp/test.log

перенаправление не прекращается. Команда продолжает выполняться, и данные продолжают накапливаться в вашей области диска. У вас просто нет права доступа к этим данным, потому что вы стерли их имя.

Вы можете создать другой, совершенно не связанный файл с именем /tmp/test.log .

Как вы заметили, пытаясь усечь файл, вы избавляетесь от данных, которые были там раньше, но внутренний дескриптор файла знает позицию в файле, на которую он указывает, и записывает после конца файла расширение файла. Отсюда ведущие нули.

Если вы хотите "сбросить" перенаправление, вам нужно убить программу ping , стереть или обрезать файл /tmp/test.log , а затем перезапустить программу ping .

Вы также можете использовать такую программу, как rotatelogs

ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600

вращать файл журнала либо на основе истекшего времени или размера файла.

0

Планируйте заранее:

  1. Усечь или удалить файл, если он существует.
  2. Используйте >> вместо > .

Таким образом, вы воспользуетесь тем фактом, что >> по сути "всегда стремится к концу файла", в то время как > поддерживает указатель на последнее записанное местоположение.

Тогда вы можете усечь файл и >> будет подчиняться. Посмотрите мой ответ, он исследует точное поведение, которое вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .