Как я могу проверить, не прошла ли фоновая работа до ее выхода?

Я пишу скрипт, который запускает виртуальный кадровый буфер с Xvfb. Я хочу убедиться, что команда выполнена успешно, но я не хочу, чтобы скрипт ждал ее завершения, потому что Xvfb продолжает работать, пока X-сервер не будет уничтожен. Например:

if ! Xvfb $DISPLAY &; then echo 'Error: failed to create virtual frame buffer' exit 1 fi xpid=$! # do stuff that uses frame buffer kill $xpid 

Проблема в том, что он вызывает синтаксическую ошибку на &; :

 $ stuff.sh stuff.sh: line 149: syntax error near unexpected token `;' stuff.sh: line 149: `if ! Xvfb $DISPLAY &; then' 

Я попытался изменить эту строку, if ! Xvfb $DISPLAY & ; if ! Xvfb $DISPLAY & ; но все равно выдает ошибку.

Символ & является control operator и завершает список проверяемых команд. Следуя этому определению, следующее не содержит синтаксических ошибок:

 if ! Xvfb $DISPLAY & then echo 'Error: failed to create virtual frame buffer' exit 1 fi 

Беда в том, что при фоновой команде Xvfb результат теста всегда будет равен нулю / истине.

Я запустил бы процесс, затем подождал бы достаточно долго, чтобы он умер, затем проверил, все ли еще вокруг:

 Xvfb $DISPLAY & xvfbpid=$! sleep 3 ## adjust to taste if ! ps -p $xvfbpid > /dev/null then echo 'Error: failed to create virtual frame buffer' exit 1 fi 

Рекомендации:

  • Базовые спецификации Open Group Issue 7, выпуск 2018 : Shell & Utilities – Язык команд оболочки – Команды оболочки – Списки – Асинхронные списки – Состояние выхода