我尝试在我的shell脚本中一次启动java programm和echo命令,首先我尝试了这个
java -jar server.jar & echo "$!" > $pidfile
但这会在回音结束时停止server.jar
,我用
java -jar server.jar & echo "$!" > $pidfile && fg
它适用于我,但我认为这不是一个干净的解决方案。
现在我需要添加另一个java程序,并且两个程序应该同时运行,如果两个程序都完成/停止,脚本应该结束。
我在另一个StackOverflow问题中读到,我应该在该行的末尾添加& wait
,但这会停止我的server.jar
。
实际上它看起来像这样:
java -jar server.jar & echo "$!" > $pidfile && fg && java -jar heartbeat.jar
编辑:
整个脚本和服务器都在tmux中运行,因此没有必要让它保持活动状态。 server.jar
运行大约24小时,heartbeat.jar
检查服务器是否处于活动状态,两者都应该以一个脚本启动。
解决方案:
java -jar server.jar & echo "$!" > $pidfile ; java -jar heartbeat.jar & fg %1
我收到jars
的两个输出,输入命令转到server.jar
答案 0 :(得分:0)
有一个名为daemon的程序可以将你的程序放在后台并将pid保存在文件中。
还有一个程序可以同时启动多个程序foreman,这对于开发来说非常有用。它用红宝石书写,但在其他语言中也有其他选择。 Java实现gaffer。
答案 1 :(得分:0)
解释一下:Java程序停止的原因是当执行脚本的shell终止时,所有后台进程都会收到HUP
信号。为防止这种情况发生,您可以在disown
之后立即使用&
将其从shell的作业列表中删除。
对于这两个Java程序,我建议:
java -jar server.jar & # start java with server.jar as a background job
echo "$!" > "$pidfile" # echo the pid of the last background job into the pid file
java -jar heartbeat.jar & # start java with heartbeat.jar as a background job
fg %1 # set server.jar as foreground job for interactive use
修改:wait
已替换为fg %1
,请参阅评论。