Мне нужно отслеживать множество веб-серверов на наличие ошибок во время выполнения, и у меня есть идея запустить такой скрипт, как
#!/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.
Заранее спасибо за любую подсказку!
Обратите внимание, что мне не нравится, когда мне предлагают использовать "мультитейл". Я пробовал, разделение экрана на панели не будет масштабироваться до десятков серверов, которые у нас сейчас есть.