Как прочитать стандартный вывод сервера и продолжить работу только после вывода сообщения

Строковая утилита Popplerpdfinfo command -предоставит вам номер страницы, позицию и имя для всех именованных мест назначения в PDF-файле. Вам нужна версия Poppler не ниже 0.58.

$ pdfinfo -dests input.pdf
Page  Destination                 Name
   1 [ XYZ null null null      ] "F1"
   1 [ XYZ  122  458 null      ] "G1.1500945"
   1 [ XYZ   79  107 null      ] "G1.1500953"
   1 [ XYZ   79   81 null      ] "G1.1500954"
   1 [ XYZ null null null      ] "P.1"
   2 [ XYZ null null null      ] "L1"
   2 [ XYZ null null null      ] "P.2"
(...)

1
30.04.2020, 07:55
2 ответа

Тяжеловесный способ сделать это использует

#!/usr/bin/env expect

spawn node server.js

set timeout -1
expect {{"listening":3000}}

# now you can process all the crap, but in Expect

interact

При использовании bash вам не нужно обрабатывать файл foo в bash. Как насчет

#!/usr/bin/env bash

node server.js &> server.out &

# busy wait
while true; do
    grep -q '{"listening":3000}' server.out && break
    sleep 1
done

# continue crap processing

Возможно, вы могли бы демонизировать сервер, пока вы на нем:

node server.js </dev/null &> server.out &
disown $!
0
28.04.2021, 23:17

Ответ Гленна с expectкажется мне отличным общим решением.

Если вам нужен более простой способ или вы не хотите/не можете ожидать установки, вот уменьшенная версия в bash:

#!/usr/bin/env bash

process() {
    # do your stuff
    echo ok
}

node server.js | ( grep -L '{"listening":3000}' ; process ) &

Я использую параметр grep -L (-l тоже будет работать нормально, но будет производить вывод ), заставляя его возвращаться, как только будет найдено совпадение. Затем управление передается функции процесса,и вы даже можете продолжить чтение вывода, если хотите.

Добавьте waitв конце, если вы не хотите, чтобы скрипт возвращался до тех пор, пока сервер не выключится.

0
28.04.2021, 23:17

Теги

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