Подтвердить что ты не робот

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

Любые идеи о том, как это сделать?

4b9b3361

Ответ 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. Для примера просмотрите справочную страницу.