java - 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

标签 java linux service jar localhost

我目前正致力于在 Linux VM 机器上实现一个可运行的 jar 作为后台服务。我使用了找到的示例 here作为工作的基础,并将 start() 方法修改为:

start() {

# Start application

java -jar /home/vagrant/sagepay-stub-1.4.jar >/var/log/sagepay-stub.log 2>&1

PID=$!

echo $PID > pid.txt

}

这会设置服务以将输出写入日志 sagepay-stub.log 并保存 PID,以便在调用服务停止方法时使用。

这是启动命令的处理程序:

case "$1" in start)

echo "Starting $APP"
start
echo "$APP started."
;;

当我调用该方法时,我得到了“Starting Sagepay-stub”输出,但随后我被卡在了脚本中。我所能做的就是 Ctrl & C 退出,这给了我输出:

"Sagepay-stub started."

现在我查看日志并看到输出符合预期 - stub 服务器已成功启动。但是我无法在端口上 wget(我已经使用 iptables 打开了相关端口)- 连接被拒绝:

Connecting to localhost|127.0.0.1|:8889... failed: Connection refused.

对问题所在的任何想法表示赞赏。我认为问题在于启动应用程序然后继续并让它在后台运行。脚本在应用程序启动时卡住等待某些东西。 jar 在没有输入的情况下在本地运行良好。

如果问题出在 PID 命令上(我在另一个线程上找到了一个可接受的答案),我怎样才能将它们注释掉并仍然能够停止服务?

也欢迎对代码提出意见

谢谢

最佳答案

您是否忘记了“java -jar [application stuff]”行后的“&”,以便在该行之后继续执行。

这与在控制台中运行命令完全相同。之后的“&”确保控制台在应用程序启动后可用。

这就是它打印“Sagepay-stub started”的原因。一旦你按下 ctrl-c,因为那是你杀死 java 进程并且 bash 脚本继续的时候。

关于java - 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19248365/

相关文章:

ios - AppDelegate valueForUndefinedKey

java - 使用 root loader 加载 jar

java - VPS 和基础架构即服务 IaaS,有什么区别?

java - Junit 在没有 ant/maven 的情况下创建报告

java - 用于在 Android 中调试构建的替代应用程序子类

android - 在 Linux Android 中获取一个文件的文件能力

linux - 阻止其他域名指向您的域名

.net - 如何从Windows服务调用Web服务?

linux - 如何对目录中的所有文件执行命令并将每个文件的输出移动到新文件夹?

android - 集中式数据访问设计逻辑