Фон:
Я пишу тестовый сценарий для части программного обеспечения вычислительной биологии. Программное обеспечение, которое я тестирую, может работать несколько дней или даже недель, поэтому оно имеет встроенную функцию восстановления в случае сбоя системы или сбоя питания.
Я пытаюсь выяснить, как проверить систему восстановления. В частности, я не могу найти способ «сбить» программу контролируемым образом. Я думал о том, как рассчитать время выполнения инструкции SIGKILL через некоторое время. Это, вероятно, не идеально, так как тестовый пример не всегда гарантирует одинаковую скорость (он работает в общей среде), поэтому сравнение журналов с желаемым выводом будет затруднено.
Это программное обеспечение печатает строку для каждого раздела анализа, который он завершает.
Вопрос:
Мне было интересно, если есть хороший / элегантный способ (в сценарии оболочки), чтобы захватить вывод из программы, а затем убить программу, когда данная строка / количество строк выводится программой?
Ответы:
Подобный скрипт-обертка является стандартным подходом. Сценарий запускает программу в фоновом режиме, а затем зацикливается, проверяя файл журнала каждую минуту на наличие какой-либо строки. Если строка найдена, фоновая программа уничтожается и скрипт завершается.
источник
Если ваша программа завершит работу в SIGPIPE (что является действием по умолчанию), этого должно быть достаточно для передачи вывода в ридер, который выйдет при чтении этой строки.
Так что это может быть так же просто, как
Если вы хотите подавить вывод по умолчанию, используйте
Аналогично, если кто-то хочет остановиться после определенного количества строк, можно использовать голову вместо sed, например
Точное время, в которое происходит уничтожение , зависит от буферизационного поведения терминала, как предполагает stardt в комментариях.
источник
sed
завершения. OP говорит: «Это программное обеспечение печатает строку для каждого раздела анализа, который оно завершает». Это может означать, что программа завершит один дополнительный раздел! Доказательство концепции:{ echo 1; sleep 3; >&2 echo peekaboo; sleep 3; echo 2; } | sed -e '/1/q'
. Смотрите этот ответ . Возможный обходной путь:( program & ) | sed -e '/Suitable text from the line/q'; killall program
. Сделайте так, чтобы ваш ответ знал о недостатке, и я отзову свое понижение.В качестве альтернативы ответу dmckee можно также использовать
grep
команду с командой-m
option (см., Например, эту страницу руководства):останавливаться, когда найдена 1 строка, соответствующая тексту, или
ждать 10 строк, которые не соответствуют заданному тексту.
источник
Вы можете использовать
expect(1)
для просмотра стандартного вывода программы, а затем выполнить предопределенное действие для некоторых шаблонов.Или однострочник для встраивания в другой скрипт:
Обратите внимание, что
expect
команда поставляется не со всеми ОС по умолчанию. Возможно, вам придется установить его.источник
set timeout -1
чтобы установить неопределенный тайм-аут, в противном случае он все закроется приexpect
тайм-ауте по умолчанию 10 секунд.Вы можете использовать выражение "while":
Вам нужно направить вывод вашего программного обеспечения (или его журналов), а затем, для каждой новой строки, выполнить условный тест, а затем запустить kill -KILL. Например (я тестировал с / var / log / messages в качестве файла журнала):
Или с программным обеспечением напрямую:
Вам нужно заменить путь журнала / имя приложения, строку для сопоставления и PID для уничтожения (вы также можете использовать killall).
Удачи с вашим программным обеспечением,
Hugo,
источник