Как «привязать» несколько файлов каналов или потоков?

565
Andrey Utkin

Мне нужно отслеживать множество веб-серверов на наличие ошибок во время выполнения, и у меня есть идея запустить такой скрипт, как

#! / bin / bash -e  # Пример набора хостов ХОСТЫ = ( host1 host2 )  для хоста в $  делать [[! -e $ .pipe]] && mkfifo $ .pipe (ssh -n $ host "tail -n0 -F / tmp / test" >> $ .pipe) & сделанный  tail -F -c +0 * .pipe 

и это якобы дало бы мне такой вывод:

==> host1.pipe <== event 1 event 2  ==> host2.pipe <== event 3 event 4  ==> host1.pipe <== event 5 

Вы получаете смысл. Я вижу строки журнала в том виде, в котором они отображаются, причем их происхождение очевидно из того, tail -Fчто обычно показывает, когда вы запускаете более одного файла.

-c +0Предполагается, что параметры хвоста позволяют печатать содержимое потока, начиная с 0-го байта.

Но это не работает! То, что я вижу, похоже

==> host1.pipe <== event 1 event 2 event 5 

То есть поток, кроме первого, не отображается.

Вот более простой вариант вышеприведенного скрипта, все еще воспроизводящий проблему:

tail -F -c +0 \ <(ssh host1 "tail -n1 -F /tmp/test") \ <(ssh host2 "tail -n1 -F /tmp/test") \ ; 

Еще проще, все еще воспроизводит проблему:

tail -F -c +0 \ <(while true; do date; sleep 1; done) \ <(while true; do date +%s; sleep 1; done) 

Я использую tail из coreutils 8.27 и ядра Linux 4.9.14.

Заранее спасибо за любую подсказку!

Обратите внимание, что мне не нравится, когда мне предлагают использовать «мультитейл». Я пробовал, разделение экрана на панели не будет масштабироваться до десятков серверов, которые у нас сейчас есть.

0
Один парень из списка рассылки coreutils подтвердил проблему и подумывает над патчем, разрешающим мой вариант использования: http://lists.gnu.org/archive/html/coreutils/2017-09/msg00021.html Andrey Utkin 6 лет назад 0

1 ответ на вопрос

0
Kamil Maciorowski

Обратите внимание, что мне не хотелось бы предлагать использовать multitail. Я пробовал, разделение экрана на панели не будет масштабироваться до десятков серверов, которые у нас сейчас есть.

Как насчет -Lварианта? Это не разделить экран.

multitail \ --mark-change \ -L "while sleep 1; do date; done" \ -L "while sleep 5; do date +%s; done" \ -L "while sleep 7; do date +%Y; done" 

Если вы хотите использовать именованные каналы, вы должны использовать -Iвместо -L. К сожалению, multitailтребует отдельного -Iдля каждого файла, это делает *подход подстановочного знака ( ) более сложным. Не повезло, его -Iwопция не работает с именованными каналами; и я не мог заставить инструмент сотрудничать xargs(по крайней мере, на моем Debian).

Еще есть способ:

multitail --mark-change --mergeall *.pipe 

Вывод будет очень похож на то, что вы ожидали от tail.

Спасибо, предложенные вами режимы действительно доставляют то, что я хочу (на данный момент протестирован только первый режим). Однако я нахожу интерфейс ncurses немного ограничивающим. У него есть собственный буфер обратной прокрутки, а я бы хотел, чтобы об этом позаботился мой терминал; имеет немного странный доступ к прокрутке. Если я не получу ответ для оригинального «хвоста» (который, как я предполагаю, содержит ошибку), я отмечу ваш ответ как выбранный. В любом случае, большое спасибо, ваша помощь высоко ценится. Andrey Utkin 6 лет назад 0

Похожие вопросы