Задать вопрос
gohellp
@gohellp
Громкое "Ы" из темноты

Как сделать возможным вывод программы в консоль?

Имеется такой скрипт:
read -p "Enter the programm's path with .js: " path
		cd "$path"
		echo "node main.js"
		nodeLogs="$(node main.js)"
			q=IFS;IFS=$'\n';nodeLogsArr=($nodeLogs);IFS="$q" #nodeLogs.split("\n")
				for logs in ${nodeLogsArr[@]}; do 
					if [[ "$logs" == "reboot" ]]; then
						echo "git pull"
						pwd="$(pwd)"
						(git pull && "/root/test \"$pwd\"")
					elif [["logs"==*"Process exit with code:"*]]; then
						echo "Process stopped:\n$logs"
					fi
				done

Я столкнулся с проблемой: мой способ получения данных с программы на даёт ей выводить эти данные в консоль. Насчёт eval думаю, но, кажется, это не совсем то, что мне нужно. Через функцию точно не буду делать, тк тогда, насколько понимаю, при каждой попытке получить вывод программа будет заново срабатывать.
Нужно, чтобы программа и выводила в консоль свой текст и записывалась в переменную. Да, я могу добавить в перебор массива else и так в консоль будет выводится каждая строка программы выводиться, но только после завершения самой программы. Хотелось бы, чтобы она сразу выводила.
Надеюсь на вашу помощь.
Заранее спасибо
  • Вопрос задан
  • 200 просмотров
Подписаться 2 Простой 9 комментариев
Решения вопроса 1
xotkot
@xotkot
хорошо есть и хорошо весьма
если нужно в динамике - одновременно выводить на консоль, писать в файл и тут же сразу построчно анализировать поступающую информацию, то тут чуть сложнее, хоть и не немного, вот небольшой пример:
работа через файл
#!/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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы