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

#!/bin/bash -e

# Example set of hosts
HOSTS=(
host1
host2
)

for host in ${HOSTS[@]}
do
        [[ ! -e ${host}.pipe ]] && mkfifo ${host}.pipe
        (ssh -n $host "tail -n0 -F /tmp/test" >> ${host}.pipe) &
done

tail -F -c +0 *.pipe

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

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

==> host2.pipe <==
event 3
event 4

==> host1.pipe <==
event 5

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

Tail options -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.

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

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

1 ответ1

0

Обратите внимание, что мне не нравится, когда мне предлагают использовать 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .