Как захватить образец вывода бесконечного процесса в bash?

#bash #process #output

#bash #процесс #вывод

Вопрос:

Я использую инструмент, который вы можете прервать только с помощью Ctrl-C (или kill ). Это мониторинг определенного компонента и представление некоторой информации каждые несколько секунд. Инструмент не поддерживает указание ограничения на количество проверок компонента перед завершением. Таким образом, он будет выполняться вечно, пока не будет остановлен.

Как я могу записать образец этого вывода в переменную для дальнейшей обработки? Я также должен остановить этот инструмент мониторинга и продолжить обработку.

Комментарии:

1. Вы хотите остановить инструмент, как только он сгенерирует определенный объем вывода, или инструмент должен продолжить работу после того, как у вас будет результат, над которым вы хотите поработать, и отдельно вы позже остановите его?

Ответ №1:

Если вы передаете свой инструмент в другую программу, и эта программа завершает работу, ваш инструмент получит SIGPIPE сигнал при следующей попытке записи в (теперь закрытый) канал и завершит работу.

Вот пример, который захватывает первые 10 строк вывода из вашего инструмента.

 sample=$(your-tool | head -10)
  

Ответ №2:

Вы можете вывести данные в файл и просто запустить tail этот файл, чтобы получить текущий вывод. Вы можете очистить файл, когда он станет слишком большим. Если вы хотите получить более конкретный ответ, вам нужно предоставить более подробную информацию. Например, если ваш процесс вызывается printJunk , вы можете запустить его как

 ./printJunk >>afile.txt
  

затем в любое время или время во время ./printJunk выполнения вы можете выполнить приведенную ниже команду, чтобы получить самые последние 10 строк в переменную:

 someVariable=$(tail -n 10 afile.txt)
  

Просмотр выходных данных файла и присвоение его переменной не окажут никакого влияния на время выполнения ./printJunk .

Когда afile.txt становится слишком большим, делайте эхо >afile.txt чтобы опустошить его. Опять же, ./printJunk не волнует, что это произойдет.