.png)
Я настроил 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
Может ли кто-нибудь объяснить, почему это так?
Есть ли между ними разница?
решение1
cat
продолжает читать, пока не получит EOF. Канал выдает EOF на выходе только тогда, когда получает EOF на входе. Демон регистрации открывает файл, записывает в него,и держать его открытым— так же, как и для обычного файла — поэтому EOF никогда не генерируется на выходе. cat
Просто продолжает чтение, блокируясь, когда исчерпывается то, что в данный момент находится в канале.
Вы можете попробовать сделать это самостоятельно вручную:
$ mkfifo test
$ cat test
И в другом терминале:
$ cat > test
hello
В другом терминале будет вывод. Затем введите:
world
Будетболеевывод в другом терминале. Если вы сейчас нажмете Ctrl-D на ввод, то другой cat
тоже прервется.
В этом случае единственное заметное различие между cat
и tail -f
будет заключаться в том, будет ли демон ведения журнала остановлен или перезапущен: cat
остановится навсегда, когда будет закрыт конец записи канала, но tail -f
продолжит работу (повторно открыв файл) при перезапуске демона.
решение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.
решение3
cat
показывает вам весь файл, когда tail -f
показывает только последние строки и последующие. Так что если файл короткий, они ведут себя одинаково, но если файл большой (100+ строк), вы можете увидеть четкую разницу между ними двумя.
Дополнительная информация об этих командах: