Як я "кот і слідкую за" файлом?


31

Послідовно завантажується файл wget.

Якщо я розпочну розпаковувати його cat myfile.tar.bz2 | tar -xj, він може розпакуватися правильно або вийти з ладу з "Несподіваним EOF", залежно від того, що швидше.

Як "котити і слідкувати" за файлом, тобто виводити вміст файлу в stdout, але не виходити з EOF, замість цього тримати subribed для цього файлу і продовжувати виводити нові частини даних, виходячи лише якщо файл закритий письменник і не повторно відкривається протягом N секунд.


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


2
Я думаю, ти шукаєш tailкоманду з її опцією follow.
keshlam

tailтакож працює з бінарними файлами?
Ві.

2
Можливо, вам також сподобається less +F...
mikeserv

Я знаю, що ви знайшли своє рішення, але у мене є питання, чому б просто не зробити:wget ... && tar xjvf ...
Джозеф Р.

@JosephR., 1. Щоб заощадити час шляхом паралелізації; 2. Зрівняти завантаження системи (уникаючи / мінімізуючи ресурс-інтенсивну фазу розпакування дросельної заслінки); 3. Щоб не згадувати про команду "Розпакувати" пізніше (або запланувати її) або вводити спочатку ланцюгову команду (коли я ще не впевнений, що хочу її розпакувати).
Ві.

Відповіді:


22
tail +1f file

Я тестував його на Ubuntu разом із джерелом tarball 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).


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, який виводить stdout за замовчуванням. І (1) -f -є надмірним, tarза замовчуванням зчитується зі stdin, і (2) більшість tars може автоматично визначати стиснення, тому jчасто буває непотрібним. curl http://... | tar x
Кевін

2
Це завантажиться без збереження розпакованого файлу. Також це заважатиме продовжувати завантаження у випадку поганої мережі.
Ві.

3
@Vi. Ви можете зберегти файл, використовуючи teeтак:, curl http://… | tee ….tbz | tar -xjале відновлення завантаження стає складнішим, ніж просто знову викликати ту саму команду.
kasperd

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Згадане іншими інтерпретується як ім'я файлу, принаймні в tailкоманді GNU .)

Наведене працює для одного файлу. З’єднання декількох файлів не зможе детерміновано слідувати за ними, не зависаючи на першому. Для " кішки і слідування ", слідуючи лише за останнім файлом, можна використовувати підстановку процесу . Ось ще одна демонстрація:

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
Джозеф К. Штраус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.