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

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

#! / bin / bash -e

# Пример набора хостов
ХОСТЫ =(
host1
host2)

для хоста в ${HOSTS[@]}
делать
        [[! -e ${хост}.pipe ]] && mkfifo ${хост}.pipe
        (ssh -n $host "tail -n0 -F /tmp/test" >> ${host}.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)

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

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

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

1 ответ

Решение

Обратите внимание, что мне не хотелось бы предлагать использовать 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, Unfortunatelly multitail требует отдельного -I для каждого файла это подстановочный знак (*) подход сложнее. Невезение его -Iw опция не работает с именованными каналами; и я не мог заставить инструмент сотрудничать с xargs (по крайней мере, на моем Debian).

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

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

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

Другие вопросы по тегам