безперервне зчитування з названої труби (кіт або хвіст -f)


16

Я налаштував rsyslogреєструвати певні події журналу для /dev/xconsole:

*.*;cron.!=info;mail.!=info      |/dev/xconsole

/dev/xconsole- названа труба ( fifo). Якщо я хочу побачити, що реєструється, можу зробити cat /dev/xconsole. Я здивований, побачивши, що команда cat /dev/xconsoleне закінчується після читання файлу, а натомість діє як tail -f. Іншими словами, дві команди поводяться однаково:

cat /dev/xconsole
tail -f /dev/xconsole

Може хтось, будь ласка, пояснить, чому це?

Чи є різниця між ними?

Відповіді:


18

catпродовжує читати, поки не отримає EOF. Труба виробляє EOF на виході лише тоді, коли отримує EOF на вході. Демон журналу відкриває файл, записує до нього та зберігає його відкритим - як і для звичайного файлу - тому EOF ніколи не створюється на виході. catпросто продовжує читати, блокуючи кожного разу, коли він вичерпує те, що зараз знаходиться в трубі.

Ви можете спробувати це вручну:

$ mkfifo test
$ cat test

І в іншому терміналі:

$ cat > test
hello

Буде вихід в інший термінал. Потім:

world

В іншому терміналі буде більше виводу. Якщо тепер увімкнути Ctrl-D, то і другий catтакож закінчиться.

У цьому випадку єдиною помітною різницею між catі tail -fбуде, якщо демон реєстрації припиняється або перезапускається: catприпиниться назавжди, коли кінець запису труби закритий, але tail -fбуде продовжуватися (повторно відкриваючи файл), коли демон буде перезапущений.


Вибачте, я не бачу, звідки у вашому прикладі
Олександр Міллс

З вашого вводу.
Майкл Гомер

1
А потім ви набираєте world, і, ось, "світ" з'являється в іншому терміналі.
Майкл Гомер

2

Існує також різниця в буферизації між catта tail -f. Ви можете перевірити це:

Створити трубу: mkfifo pipe

Почніть читати трубу, використовуючи catу фоновому режимі:cat pipe &

Відкрийте трубу і напишіть їй щосекунди: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

Тепер спробуйте це з tail -f pipe &замість cat. Таким чином, ви можете побачити, що catдрукує рядки, як тільки вони будуть записані на папку perl-скриптом, в той час як tail -f буферизує їх до 4 кб перед друком для stdout.


-2

catпоказує весь файл, коли tail -fпоказує лише останні рядки та наступні. Отже, якщо файл короткий, вони поводяться однаково, але якщо файл великий (100+ рядків), ви можете помітити різницю між ними.

Додаткова інформація про ці команди:

tail http://www.computerhope.com/unix/utail.htm

cat http://www.computerhope.com/unix/ucat.htm

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.