我目前正致力于在 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/