5

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

开始() {

# 启动应用程序

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

PID=$!

回声 $PID > pid.txt

}

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

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

案例“$1”在开始)

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

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

“Sagepay-stub 开始了。”

现在我查看日志并看到输出与预期一样 - 存根服务器已成功启动。但我无法在端口上获取(我已经使用 iptables 打开了相关端口) - 连接被拒绝:

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

任何关于问题所在的想法都值得赞赏。我认为问题在于启动应用程序然后继续并让它在后台运行。脚本在应用程序启动时卡住等待某些东西。jar 在本地运行良好,无需输入。

如果问题出在 PID 命令上(我在另一个线程上找到了已接受的答案),我该如何注释掉这些命令并仍然能够停止服务?

代码评论也欢迎

谢谢

4

1 回答 1

5

你有没有忘记'java -jar [application stuff]'行之后的'&',以便在该行之后继续执行。

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

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

于 2013-10-08T13:42:36.400 回答