如何在后台作业退出之前测试它是否失败?

Big*_*uge 4 shell-script background-process x

我正在编写一个使用 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
Run Code Online (Sandbox Code Playgroud)

问题在于它会在以下位置引发语法错误&;

$ stuff.sh 
stuff.sh: line 149: syntax error near unexpected token `;'
stuff.sh: line 149: `if ! Xvfb $DISPLAY &; then'
Run Code Online (Sandbox Code Playgroud)

我尝试将该行更改为,if ! Xvfb $DISPLAY & ;但它仍然会引发错误。

Jef*_*ler 8

&符号是control operator结束待测试的命令的列表。根据该定义,以下内容没有语法错误:

if ! Xvfb $DISPLAY & then
    echo 'Error: failed to create virtual frame buffer'
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

问题是,通过后台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
Run Code Online (Sandbox Code Playgroud)

参考:

  • 使用 `kill -0 "$xvfbpid"` 也可以测试给定的 PID 是否还活着。 (2认同)