последовательность Баша:дождитесь вывода, затем запустите следующую программу

StackOverflow https://stackoverflow.com//questions/21001220

Вопрос

В моем случае мне нужно бежать openvpn перед подключением к серверу по SSH, и openvpn Команда выдает «Последовательность инициализации завершена».

Итак, я хочу, чтобы мой скрипт настроил openvpn а затем войти по SSH.

Мой вопрос:Как выполнить команду в bash в фоновом режиме и дождаться, пока она отобразит «завершено», прежде чем запускать другую программу?

Мой текущий способ сделать это - открыть две панели терминала, одна из которых работает:

sudo openvpn --config FILE

а в другом я запускаю:

ssh SERVER

как только первая панель терминала показала мне текст «Последовательность инициализации завершена».

Это было полезно?

Решение

Кажется, ты хочешь запустить openvpn как процесс в фоновом режиме, обрабатывая его стандартный вывод на переднем плане.

exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER

Объяснение

Разобьем его на части:

  1. echo <(sudo openvpn --config FILE) распечатаю что-то вроде /dev/fd63
    • тот <(..) бежит openvpn на заднем плане и...
    • присоединяет свой стандартный вывод к файловому дескриптору, который распечатывается echo
  2. exec 3< /dev/fd63
    • (где /dev/fd63 это дескриптор файла, напечатанный с шага 1)
    • это сообщает оболочке открыть дескриптор файла (/dev/fd63) для чтения и...
    • сделать его доступным в файловом дескрипторе 3
  3. sed '/Initialization Sequence Completed$/q' <&3
    • теперь мы бежим СЭД на переднем плане, но заставьте его читать из файлового дескриптора 3 мы только что открылись
    • как только СЭД видит, что текущая строка заканчивается надписью «Initialization Sequence Completed», он завершает работу ( часть)
  4. cat <&3 &
    • openvpn продолжит запись в файловый дескриптор 3 и в конечном итоге заблокировать, если из него ничего не читается
    • чтобы предотвратить это, мы запускаем кот в фоновом режиме, чтобы прочитать остальную часть вывода

Основная идея – запустить openvpn в фоновом режиме, но запишите его вывод где-нибудь, чтобы мы могли запустить команду на переднем плане, которая будет блокироваться до тех пор, пока не прочитает волшебные слова «Последовательность инициализации завершена».Приведенный выше код пытается сделать это, не создавая беспорядочных временных файлов, но более простым способом может быть просто использование временного файла.

Другие советы

Использовать -m 1 вместе с --line-buffered в grep, чтобы завершить grep после первого совпадения в непрерывном потоке.Это должно работать:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top