Как "привязать" несколько файлов каналов или потоков?
Мне нужно отслеживать множество веб-серверов на наличие ошибок во время выполнения, и у меня есть идея запустить такой скрипт, как
#! / 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
,