Я настроил 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
Может кто-нибудь объяснить, почему это так?
Есть ли разница между ними?
world
, и вот, "мир" появляется в другом терминале.Существует также разница в буферизации между
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 КБ перед печатью на стандартный вывод.источник
cat
показывает весь файл, когдаtail -f
показывает только последние строки и следует. Поэтому, если файл короткий, они ведут себя одинаково, но если файл большой (более 100 строк), вы можете увидеть четкую разницу между ними двумя.Дополнительная информация об этих командах:
tail
http://www.computerhope.com/unix/utail.htmcat
http://www.computerhope.com/unix/ucat.htmисточник