同时启动多个程序

时间:2015-02-27 09:22:52

标签: linux bash shell

我尝试在我的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

2 个答案:

答案 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,请参阅评论。