Скрипт Bash для запуска команды и отображения вывода консоли до появления какой-либо фразы или тайм-аута - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать bash-скрипт для запуска веб-сервера. Мне нужно, чтобы скрипт отображал выходные данные веб-сервера в консоли, пока на консоли не появится определенное слово, указывающее, либо инициализация сервера завершена успешно, либо произошла какая-то ошибка.

Мне удалось показать выходные данные консоли до истечения времени ожидания:

#!/bin/bash
(exec /opt/aspnetcore-runtime-3.0.0-linux-x64/dotnet /opt/app/Launcher.dll &) | (timeout --foreground 6 cat; cat > /dev/null &)

Если ошибка возникает раньше, чем через 6 секунд, то веб-сервер останавливается, и управление возвращается к терминалу, что является требуемым поведением.

Однако, если инициализация веб-серверабыл успешно завершен через 2 секунды, пользователь должен ждать еще 4 секунды, пока сценарий не завершится. Я хочу вернуть элемент управления обратно в терминал, как только на консоли появится какая-нибудь фраза (например, SUCCESS INIT!).

1 Ответ

1 голос
/ 06 ноября 2019

На поверхности, заменив текущее ожидание ('cat') на пользовательский цикл, который завершится, когда 'SUCCESS INIT!'Обнаружено, что это решит проблему

Такой цикл может быть реализован с помощью

while read x && echo "$x" && [ "$x" != "SUCCESS INIT!" ] ; do : ; done

И объединенной команды

(Launch-command &) | (timeout --foreground 6 sh -c 'while read x && echo "$x" && [ "$x" != "SUCCESS INIT!" ] ; do : ; done' ; cat > /dev/null &)

Не очень элегантно. Если вы можете, поместите 'timeout ... while ...' в отдельный скрипт. Я не тестировал, но должно работать:

#! /bin/bash
# wait-line.sh
timeout --foreground "$1" sh -c "while read x && echo "$x" && [ "$x" != "$2" ] ; do : done "
cat > /dev/null

И тогда оригинальная командная строка будет выглядеть как

( Launch-command ... & ) | ( wait-line.sh 6 "SUCCESS INIT!" &)
...