если нужно в динамике - одновременно выводить на консоль, писать в файл и тут же сразу построчно анализировать поступающую информацию, то тут чуть сложнее, хоть и не немного, вот небольшой пример:
работа через файл
#!/usr/bin/env bash
# функции бот1 и бот2 которые постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
bot1(){
while true; do
echo "Bot1: $[RANDOM%10]"
sleep 2
done
}
bot2(){
while true; do
echo "Bot2: $[RANDOM%10]"
sleep 2
done
}
# путь к лог-файлу куда будем писать логи от ботов
LOG=/tmp/botsLog.txt
# удаляем лог-файл (если ненужно то закоментирвоать)
rm -rf $LOG
# запускаем ботов в фоновом(&) режиме,
# а также начинаем выводит поступающую от них информацию на консоль и писать в общий лог-файл
bot1 | tee -a $LOG &
sleep 1
bot2 | tee -a $LOG &
# функция анализа лог-файла (потока)
analysisLogs() {
# запускаем постоянное построчное чтение поступающих данных в функцию
while read -r data; do
# здесь мы задаём фильтры и то что выполнить если совпадёт условие
case "$data" in
"Bot1: 0" ) echo "Бот 1 выдал ноль"
;;
"Bot2: 0" ) echo "Бот 2 выдал ноль"
;;
esac
done
}
# tail выводит поступающие данные по мере роста лог-файла (мониторит)
# в данном случае мы передаём появляющиеся данные из файла в функцию analysisLogs
tail -f $LOG | analysisLogs
# это необходимо чтобы главная программа преждевременно не завершилась
# пока не завершаться запущенные в ней фоновые(&) потоки
wait
exit
с комментариями думаю будет понятней
ctrl+c завершить скрипт
можно конечно и через переменную сделать но это будет не так красиво да и
не по феншую, кстати здесь мы пишем в ОЗУ так как
/tmp у большинства дистрибутивов примонтирован в оперативной памяти.
Если же не хочется вообще писать данные на диск или в озу, так как логи обычно склонны к накоплению если их не чистить да или просто ненужны, то можно просто использовать именованный канал(FIFO-файлы) с которым можно работать как с файлом(читать/писать) но при этом он будет выступать просто в роли промежуточного буфера, для этого в нашей программе нужно поменять всего две строчки(создать именованный канал и вместо tail использовать обычный cat )
работа через fifo-файл
#!/usr/bin/env bash
# бот1 и бот2 просто постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
bot1(){
while true; do
echo "Bot1: $[RANDOM%10]"
sleep 2
done
}
bot2(){
while true; do
echo "Bot2: $[RANDOM%10]"
sleep 2
done
}
# путь к лог-файлу куда будем писать логи от ботов
LOG=/tmp/botsLog.txt
# удаляем лог-файл
rm -rf $LOG
# создаём именованный канал (FIFO-файл)
mkfifo $LOG
# запускаем ботов в фоновом(&) режиме,
# а также начинаем выводит поступающую от них информацию на консоль и писать в общий fifo-файл
bot1 | tee -a $LOG &
sleep 1
bot2 | tee -a $LOG &
# функция анализа поступающих данных
analysisLogs() {
# запускаем постоянное построчное чтение поступающих данных в функцию
while read -r data; do
# здесь мы задаём фильтры и то что выполнить если сработает условие
case "$data" in
"Bot1: 0" ) echo "Бот 1 выдал ноль"
;;
"Bot2: 0" ) echo "Бот 2 выдал ноль"
;;
esac
done
}
# читаем файл(FIFO-файл) и передаём появляющиеся данные в функцию analysisLogs
cat $LOG | analysisLogs
# это необходимо чтобы главная программа преждевременно не завершилась
# пока не завершаться запущенные в ней фоновые(&) потоки
wait
exit