运行 后台进程(网络服务器)只要其他进程(测试套件)执行

Running background process (webserver) for just as long as other process (test suite) executes

我正在寻找一个 unix shell 命令,它允许我在后台 运行 一个进程(恰好是一个网络服务器)与另一个前台进程(这恰好是一个测试套件)执行。即前台进程退出后,后台进程也应该退出。到目前为止我所拥有的是

.. preliminary work .. && (webserver & test)

这很接近,但失败了,因为网络服务器进程永远不会退出。有没有一种好的方法可以在单个命令中表达这一点,或者为此编写更详细的脚本是否更合理?


为了提供更多细节(并欢迎任何相关建议),我正在编写一个 javascript 库,我想使用 Selenium 对其进行测试 - 因此网络服务器需要执行 'alongside' 测试套件。在我试图废除 G运行t & co 的过程中。并按照 leaner, npm-based approach 进入任务管理 我遇到了这个 shell 相关的路障。

你可以试试这个:

# .. preliminary work ..
webserver &
PID=$!
test_suite &
(wait $!; kill $PID)

只要您不介意这两个命令都在后台 运行,这将有效。这里发生的是:

  1. 网络服务器在后台启动。
  2. 它的pid赋给$PID.
  3. 测试套件在后台启动。
  4. 最后一行等待测试套件退出,然后终止网络服务器。

如果你需要任何一个命令在前台,那么运行这个版本

# .. preliminary work ..
screen -dm -S webserver webserver
screen -dm -S test_suite test_suite
(wait "$(screen -ls | awk '/\.test_suite\t/ {print strtonum()}')"
screen -X -S webserver -p 0 kill) &
screen -r test_suite

请注意,这需要 screen 命令(使用 apt-get install screen 进行安装,如果有 ubuntu,则使用 ubuntu's website)。这是做什么的:

  1. 启动网络服务器
  2. 启动测试套件。
  3. 等待测试套件退出,然后终止网络服务器
  4. 同时,在屏幕上恢复测试套件