Bash Script: Как я могу ждать определенного выхода из процесса, а затем продолжить?
Я пытаюсь написать bash script, чтобы сделать что-то, запустить процесс, дождаться, пока этот процесс будет готов, и затем сделайте больше вещей, пока этот процесс продолжает работать. Проблема, с которой я сталкиваюсь, - найти способ дождаться, когда этот процесс будет готов, прежде чем продолжить, и позволить ему продолжать работать.
В моем конкретном случае я пытаюсь настроить PPP-соединение. Мне нужно подождать, пока он не подключится, прежде чем я запустим следующую команду. Я также хотел бы остановить script, если PPP не сможет подключиться. pppd выводит на стандартный вывод.
В коде psuedo я хочу сделать следующее:
[some stuff]
echo START
[set up the ppp connection]
pppd <options> /dev/ttyUSB0
while 1
if output of pppd contains "Script /etc/ppp/ipv6-up finished (pid ####), status = 0x0"
break
if output of pppd contains "Sending requests timed out"
exit 1
[more stuff, and pppd continues to run]
echo CONTINUING
Любые идеи о том, как это сделать?
Ответы
Ответ 1
Мне пришлось сделать что-то подобное, ожидая появления строки в /var/log/syslog. Это то, что сработало для меня:
FILE_TO_WATCH=/var/log/syslog
SEARCH_PATTERN='file system mounted'
tail -f -n0 ${FILE_TO_WATCH} | grep -qe ${SEARCH_PATTERN}
if [ $? == 1 ]; then
echo "Search terminated without finding the pattern"
fi
Он соединяет все новые строки, прикрепленные к просмотренному файлу, к grep и инструктирует grep выйти спокойно, как только будет обнаружен шаблон. Следующий оператор if обнаруживает, что "wait" завершен без поиска шаблона.
Ответ 2
Есть инструмент под названием "Ожидать", который делает почти то, что вы хотите. Дополнительная информация: http://en.wikipedia.org/wiki/Expect
Вы также можете взглянуть на страницы руководства для "чата", которая является функцией pppd, которая делает некоторые вещи, которые могут ожидать.
Ответ 3
Самое быстрое решение, с которым я столкнулся, состояло в том, чтобы запустить pppd с nohup в фоновом режиме и проверить файл nobup.out для stdout. В итоге получилось что-то вроде этого:
sudo nohup pppd [options] 2> /dev/null &
# check to see if it started correctly
PPP_RESULT="unknown"
while true; do
if [[ $PPP_RESULT != "unknown" ]]; then
break
fi
sleep 1
# read in the file containing the std out of the pppd command
# and look for the lines that tell us what happened
while read line; do
if [[ $line == Script\ /etc/ppp/ipv6-up\ finished* ]]; then
echo "pppd has been successfully started"
PPP_RESULT="success"
break
elif [[ $line == LCP:\ timeout\ sending\ Config-Requests ]]; then
echo "pppd was unable to connect"
PPP_RESULT="failed"
break
elif [[ $line == *is\ locked\ by\ pid* ]]; then
echo "pppd is already running and has locked the serial port."
PPP_RESULT="running"
break;
fi
done < <( sudo cat ./nohup.out )
done
Ответ 4
Если вы отправитесь с expect
, как указано в @sblom, проверьте autoexpect
.
Вы запускаете то, что вам нужно с помощью команды autoexpect
, и создаст expect
script.
Для примера просмотрите справочную страницу.