Хвост -f ломается, когда файл усечен

Я использую tail -f (в терминале на Mac OS X el capitan) для просмотра живых изменений в моем файле (результаты вытаскивания данных из базы данных с использованием сценария PERL). Однако иногда скрипт Perl усекает файл и добавит к нему новые данные. Иногда, когда это происходит, оно дает мне следующее сообщение:

 tail: test.txt: file truncated 

И затем после этого не отображается содержимое файла. Это происходит, только когда я заменяю файл строками LESS, чем раньше. Когда новые строки длиннее, чем перед запуском скрипта, я не получаю эту ошибку, и tail -f продолжает работать. Я подтвердил, что на самом деле есть данные в файле, которые tail -f не показывает после получения этого сообщения (error?).

  • Как измерить изменения в файловой системе, выполненные определенным приложением?
  • Лучшие варианты установки жесткого диска Mac OS X на моем Linux-боксе?
  • Двунаправленная ОС X и Fedora
  • Как настроить Emacs для использования «ispell» в Mac OS X?
  • Аутентификация открытого ключа SSH работает в локальной сети, а не из WAN
  • Перемещение тысяч файлов jpg в ежедневные каталоги на основе файлов даты создания EXIF
  • Я видел этот похожий вопрос: Подавлять сообщения об усечении файла при использовании хвоста

     tail -f test.txt 2> /dev/null 

    Но это просто подавляет сообщение и все еще ломается, оно не продолжает показывать мне более короткое, усеченное содержимое файла.

    Есть ли более эффективная команда для использования изменений вида просмотра в файле? Или флаг для tail -f не заботится, когда файл усечен?

  • Почему интерактивные оболочки на OSX-входах по умолчанию?
  • Является ли Mac OS X UNIX?
  • Передача файлов Сообщение SSH SCP об ошибке: «Stdin: не является tty»
  • Нельзя вводить символы AltGr в терминале OSX
  • Какую версию bash я запускаю
  • Удаление бесконечно вложенных каталогов
  • 3 Solutions collect form web for “Хвост -f ломается, когда файл усечен”

    Как указывали другие, команда tail которая поставляется с OS X, не имеет опции --retry . Однако вы можете просто установить версию хвоста GNU, которая имеет этот параметр; он является частью GNU coreutils . Например, если вы используете MacPorts, вы можете установить их, запустив sudo port install coreutils .

    Альтернативой прямому просмотру файла является команда watch , которая, к сожалению, также не поставляется с OS X. Однако вы можете использовать это обходное решение .

    Вот сценарий tail-F Он принимает один аргумент – файл в хвост. Вероятно, есть лучшие варианты (например, установка tail GNU), но здесь показано, что простые версии инструментов часто могут быть созданы из доступных частей.

     #!/bin/bash # file="$1" size=$(stat -c '%s' "$file" 2>/dev/null) test -z "$size" && echo "No file '$file'" >&2 while sleep 1 do n_size=$(stat -c '%s' "$file" 2>/dev/null) if [[ -n "$n_size" ]] then if [[ 0 == "$size" ]] then # Output whole file (so far) dd bs=1K if="$file" 2>/dev/null size="$n_size" elif [[ "$n_size" > "${size:-0}" ]] then # Output new part of file dd bs="$size" skip=1 if="$file" 2>/dev/null size="$n_size" elif [[ -z "$size" ]] then echo "New file '$file'" >&2 size=0 elif [[ "$n_size" < "${size:-0}" ]] then echo "Rewinding file '$file'" >&2 size=0 fi fi done 

    Следующая команда позволяет повторить попытку файла, даже если он удален или недоступен. Он снова распечатает содержимое после его создания.

     tail -F filename --retry 
    Linux и Unix - лучшая ОС в мире.