Как мне «следить и следить» за файлом?

31

Файл последовательно загружается wget.

Если я начну распаковывать его cat myfile.tar.bz2 | tar -xj, он может распаковать правильно или потерпеть неудачу с «Неожиданным EOF», в зависимости от того, что быстрее.

Как «отслеживать и отслеживать» файл, т.е. выводить содержимое файла на стандартный вывод, но не выходить в EOF, вместо этого сохранять подписку на этот файл и продолжать выводить новые части данных, выходя только в том случае, если файл закрыт писатель и не открывался в течение N секунд.


Я создал сценарий cat_and_follow , основанный на @ arielCo в ответ , что также расторгает , tailкогда файл не открыт для записи больше.

Vi.
источник
2
Я думаю, что вы ищете tailкоманду с ее последующей функцией.
Кешлам
tailтакже работает с бинарными файлами?
Ви.
2
Вам также может понравиться less +F...
mikeserv
Я знаю, что вы нашли свое решение, но у меня есть вопрос, почему бы просто не сделать:wget ... && tar xjvf ...
Джозеф Р.
@JosephR., 1. Чтобы сэкономить время путем распараллеливания; 2. Выровнять нагрузку на систему (избегая / минимизируя ресурсоемкую фазу распаковки полного газа); 3. Чтобы не вспоминать о команде «распаковать» позже (или планировать ее) или вводить команду с цепочкой в ​​первую очередь (когда я еще не уверен, что хочу ее распаковать).
Ви.

Ответы:

22
tail +1f file

Я тестировал его в Ubuntu с архивом исходного кода LibreOffice, пока wgetзагружал его:

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

Он также работает на Solaris 10, RHEL3, AIX 5 и Busybox 1.22.1 в моем телефоне Android (используется tail +1 -f fileс Busybox).

arielCo
источник
1
Будет ли он автоматически завершаться после завершения загрузки? Я ожидаю, что «подписчик» будет /proc/*/fd/периодически сканировать и проверять, закрыт ли файл навсегда.
Ви.
2
Я не ожидал, что это tailработает с файлами binray ...
Vi.
Создан скрипт, который выполняет сканирование /proc/../fd и автоматическое завершение.
Ви.
1
Вам не нужен хвост GNU, я считаю, что этот -fвариант стандартный. Тем не менее, он не завершится автоматически, когда загрузка будет завершена.
Бармар
4
В Ubuntu tail +1fне работает. Вы должны сделатьtail -n +1
dangonfast
11

Проблема в том, что catне знает, что файл все еще добавляется. Как только catвстречает (текущий) конец файла, он выходит.

Вы должны сделать wgetзапись в канал (или FIFO), чтобы избежать этого.

wget -O - http://... | tar -xjf -
Хауке Лагинг
источник
7
Или curl, который выводит на стандартный вывод по умолчанию. И (1) -f -является избыточным, tarчитает из стандартного стандартного ввода по умолчанию, и (2) большинство tars могут автоматически определять сжатие, поэтому jчасто это не требуется. curl http://... | tar x
Кевин
2
Это загрузит без сохранения распакованного файла. Также это будет препятствовать продолжению загрузки в случае плохой сети.
Ви.
3
@Vi. Вы можете сохранить файл, используя следующую команду tee:, curl http://… | tee ….tbz | tar -xjно возобновление загрузки становится более сложным, чем повторный вызов той же команды.
Касперд
5

Чтобы прочитать и проследить за файлом с начала и до прерывания:

tail -fn +1 file

Чтобы продемонстрировать это, попробуйте это (предполагая Bash с GNU Coreutils):

(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file  # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill %  # Kills the while-loop.

(Примечание: +1fупомянутое другими интерпретируется как имя файла, по крайней мере, в команде GNU tail.)

Вышеуказанное работает для одного файла. Конкатенация нескольких файлов не сможет следовать за всеми ними детерминистически, не повиснув на первом. Чтобы « следить и следовать », следуя только за последним файлом, можно использовать подстановку процесса . Вот еще одна демонстрация:

printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2)  # (Interrupt or kill it.)
kill %  # Kills the while-loop.
Джеймс Хей
источник
Это сработало для меня, пока tail +1f fileнет.
therealfarfetchd
Этот ответ намного лучше, чем tail +1fпри сочетании его с другими вариантами, такими как--pid
Джозеф К. Штраус