linux - 同时启动多个程序

标签 linux bash shell

我尝试在我的 shell 脚本中同时启动一个 java 程序和一个 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

最佳答案

只是解释一下: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,见评论。

关于linux - 同时启动多个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761438/

相关文章:

c# - C#-当数据约为400 MB时如何处理Process.StandardOutput中的数据

c++ - gsoap linux c++/struct 传递失败

java - 在 Linux (Ubuntu) 中禁用快捷键

linux - 用于驱动显示静态网页的简单信息亭的 Micro Linux PC 解决方案

linux - bash 变量中的 Bash 脚本

json - jq 更新 json 文件中的 bool 值

linux - Bash 在传递给另一个 bash shell 时丢弃命令行参数

python - GSutil 使用跟踪器文件恢复下载

bash - 调用名称存储在 bash 变量中的函数

带有颜色的 Linux IO 重定向