Bash скрипт не завершается после запуска процесса - PullRequest
0 голосов
/ 11 марта 2020

Как мне изменить мой bash сценарий logi c, чтобы он выходил из режима l oop и выходил из самого сценария после запуска процесса с именем custom_app в моей локальной Ubuntu 18.04? Я попытался использовать break и exit внутри оператора if, но безуспешно.

Как только пользовательское приложение запускается, скажем, с 1-й попытки, я выхожу из приложения, run_custom_app. sh задерживается в фоновом режиме и возобновляет попытки 2-го, 3-го, 4-го, 5-го раза. На этом этапе он ничего не должен делать, поскольку приложение уже успешно запущено и пользователь намеренно завершил работу.

Ниже приведено описание run_custom_app. sh используется для запуска моего пользовательского приложения, запускаемого с помощью нажатия кнопки веб-сайта.

Лог сценария c

  1. Проверьте, запущен ли уже процесс custom_app. Если это так, не запускайте команды в блоке while. Ничего не делать. Выйти из run_custom_app. sh.
  2. Когда процесс custom_app НЕ выполняется, повторите попытку до 5 раз.

  3. После запуска процесса custom_app остановите, пока l oop и выйдите из run_custom_app. sh.

  4. В случаях, когда были предприняты 5 попыток запуска, но процесс custom_app все еще не запущен, отобразите сообщение для пользователя.
#!/bin/sh

RETRYCOUNT=0
PROCESS_RUNNING=`ps cax | grep custom_app`

# Try to connect until process is running. Retry up to 5 times. Wait 10 secs between each retry.

while [ ! "$PROCESS_RUNNING" ] && [ "$RETRYCOUNT" -le 5 ]; do
  RETRYCOUNT="`expr $RETRYCOUNT + 1`"

  commands

  sleep 10

  PROCESS_RUNNING=`ps cax | grep custom_app`

  if [ "$PROCESS_RUNNING" ]; then
    break
  fi
done


# Display an error message if not connected after 5 connection attempts
if [ ! "$PROCESS_RUNNING" ]; then
  echo "Failed to connect, please try again in about 2 minutes"   # I need to modify this later so it opens a Terminal window displaying the echo statement, not yet sure how.
fi

1 Ответ

2 голосов
/ 11 марта 2020

Я протестировал этот код на VirtualBox в качестве замены для custom_app, а в предыдущем посте вместо ps использовались until l oop и pgrep. Как подсказывает DavidC.Rankin pidof, это более правильно, но если вы хотите использовать ps, тогда я предлагаю использовать ps -C custom_app -o pid=

#!/bin/sh

retrycount=0

until my_app_pid=$(ps -C VirtualBox -o pid=); do  ##: save the output of ps in a variable so we can check/test it for later.
  echo commands  ##: Just echoed the command here not sure which commands you are using/running.
  if [ "$retrycount" -eq 4 ]; then ##: We started at 0 so the fifth count is 4
    break  ##: exit the loop 
  fi
  sleep 10
  retrycount=$((retrycount+1))  ##: increment by one using shell syntax without expr
done

if [ -n "$my_app_pid" ]; then  ##: if $my_app_pid is not empty
  echo "app is running"
else
  echo "Failed to connect, please try again in about 2 minutes"  >&2 ##: print the message to stderr 
  exit 1 ##: exit with a failure which is not 0
fi
  • Переменное значение my_app_pid=$(ps -C VirtualBox -o pid=) имеет полезный статус выхода, поэтому мы можем его использовать.

  • По сути, until l oop является противоположностью, в то время как l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...