如何用bash脚本启动-jar进程并向他发送请求?

如何用bash脚本启动-jar进程并向他发送请求?

我需要启动jar过程并向他发送请求:

    java -jar parser-0.0.1-SNAPSHOT.jar
    curl -d '{"query":"'"$query"'", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer > FQ

但是,当.jar文件成功启动时 - 系统停止并且不会进入下一步(curl...

我怎样才能完全等待该过程完成并发送请求?

答案1

这里有几个问题:

  1. java 命令将不会返回,直到它启动的进程退出并将控制权返回给 shell。这可能意味着它启动并运行 jarfile 中的代码,然后最终调用exit,或者可能意味着 java 进程由于某种原因失败。“系统”尚未停止,但当前运行的 shell 进程正在等待该java进程返回。也许那个 Java 代码绝不调用exit,在这种情况下你的脚本将永远等待。
  2. 如果你将要启动的 JVM 放在后台 shell 中(通过& 例如),那么下一个命令可能会在 Java 程序完全启动并准备好处理请求之前尝试连接。您的 Java 程序和 curl 命令在启动条件下“竞争”。现在您的脚本可能必须有一个重试机制,而这个机制总是相当脆弱。
  3. 没有明显的方法来控制您正在运行的 Java 程序的生命周期。一旦进入后台,您必须使用类似 之类的方法管理停止它(例如)kill。重新启动需要大量复杂的脚本。这意味着您必须编写脚本来收集 PID,甚至可能维护一个“信号量”文件,以便处理启动/停止状态。

一个解决方案是将 Java 程序启动器安装为单独的“服务”,由 Ubuntu 服务启动机制控制。我在这里只是举手之劳,但我确信其他问答中讨论过这个问题。但这个想法是,Java 程序的生命周期由系统维护,而不是由您在终端上运行的 shell 脚本维护。或者,至少不是只是作为 shell 脚本只有你在终端运行。

一旦服务运行,您就可以curl根据自己的心意编写脚本命令。

但将任何服务器活动与任何客户端活动分离是一种很好的设计。不过,您的客户端请求应该始终处理因任何原因无法访问服务器的情况,即使这种处理是向用户返回错误消息。

最后,如果您要做的只是启动 Java 服务并让它启动,以便稍后在命令行或脚本中发出命令来连接到该服务,那么测试此场景的一种简单方法是打开两个终端。一个是您运行服务的地方,另一个是您运行客户端 curl 命令的地方。

相关内容