我需要启动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
这里有几个问题:
- java 命令将不会返回,直到它启动的进程退出并将控制权返回给 shell。这可能意味着它启动并运行 jarfile 中的代码,然后最终调用
exit
,或者可能意味着 java 进程由于某种原因失败。“系统”尚未停止,但当前运行的 shell 进程正在等待该java
进程返回。也许那个 Java 代码绝不调用exit
,在这种情况下你的脚本将永远等待。 - 如果你将要启动的 JVM 放在后台 shell 中(通过
&
例如),那么下一个命令可能会在 Java 程序完全启动并准备好处理请求之前尝试连接。您的 Java 程序和 curl 命令在启动条件下“竞争”。现在您的脚本可能必须有一个重试机制,而这个机制总是相当脆弱。 - 没有明显的方法来控制您正在运行的 Java 程序的生命周期。一旦进入后台,您必须使用类似 之类的方法管理停止它(例如)
kill
。重新启动需要大量复杂的脚本。这意味着您必须编写脚本来收集 PID,甚至可能维护一个“信号量”文件,以便处理启动/停止状态。
一个解决方案是将 Java 程序启动器安装为单独的“服务”,由 Ubuntu 服务启动机制控制。我在这里只是举手之劳,但我确信其他问答中讨论过这个问题。但这个想法是,Java 程序的生命周期由系统维护,而不是由您在终端上运行的 shell 脚本维护。或者,至少不是只是作为 shell 脚本只有你在终端运行。
一旦服务运行,您就可以curl
根据自己的心意编写脚本命令。
但将任何服务器活动与任何客户端活动分离是一种很好的设计。不过,您的客户端请求应该始终处理因任何原因无法访问服务器的情况,即使这种处理是向用户返回错误消息。
最后,如果您要做的只是启动 Java 服务并让它启动,以便稍后在命令行或脚本中发出命令来连接到该服务,那么测试此场景的一种简单方法是打开两个终端。一个是您运行服务的地方,另一个是您运行客户端 curl 命令的地方。