【问题标题】:Best practice for running a process in background and wait until it's ready在后台运行进程并等待它准备好的最佳实践
【发布时间】:2015-06-08 11:34:24
【问题描述】:

系统:

  • 用 Java (Play Framework 2.3.x) 编写的后端应用程序(RESTful HTTP API)
  • 用 Javascript 编写的前端应用程序(GUI,使用 API)(带有 grunt 的 angularjs 用于构建)
  • Travis CI 用于持续集成

问题:

我想启动/运行后端应用程序,在它成功启动后,我想用量角器测试它(通过 grunt 任务)。

但是启动后端应用程序不会继续,因为它不是结束进程(服务器正在运行 -> 未结束)

通过添加&将服务器作为后端进程启动可以解决问题,但不能保证服务器同时启动。

网上的一些建议说:

添加 sleep(x) 并在此之后运行测试

但是 x 是多少?

是否有其他方法可以做到这一点,而不是猜测(或测量)启动服务器的时间并在将服务器作为后台进程启动后进入睡眠状态?

编辑: 启动服务器的输出(例如周期性比较后台任务的输出)是这样的:

$ activator run
[info] Loading project definition from ...
[info] Set current project to ... (in build file:...)

--- (Running the application, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

【问题讨论】:

  • 如果启动服务器的进程启动一个单独的进程并完成,那么您可以使用wait。否则,您可以使用基于读取输出的方法(例如,等到打印特定消息)。
  • @TomFenech 是的,第二种方法是我最初的想法。你有一个例子吗?我想这可能是一个可以接受的答案。
  • 为此,我们需要查看启动过程的输出样本,指出哪个部分应该表明服务器已成功启动。
  • @TomFenech 我用输出更新了问题,我认为可以将输出与“服务器启动,使用 Ctrl+D 停止并返回控制台...)”进行比较好的
  • 使用“nohup”命令怎么样?

标签: shell unix travis-ci


【解决方案1】:

您可以做的比通过简单的外部测试来猜测或估计在测试之前要休眠多长时间以查看服务器是否已启动,例如,

while ! curl -s 0:0:0:0:0:0:0:0:9000 >/dev/null; do
    sleep 1
done

# now start real tests
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2021-12-14
    • 2013-02-02
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多