求助:无法通过Shell脚本或后台命令稳定运行Java程序
问题描述
我编写了如下Shell脚本,用于编译并运行Java程序EnduserCredentialExample.java:
#!/bin/bash DIR="$(dirname "$(readlink -f "$0")")/" cd "$DIR" javac -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java echo "JAVA_KAFKA script running now"
但无法将其后台运行。我尝试了以下两种后台运行命令:
nohup java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java > output.log 2> error.log & java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java > /dev/null 2>&1 &
执行这些命令后,程序会启动,但5秒后就停止运行。不过若直接在终端手动执行以下Java命令(不加nohup及后台相关参数),程序却能正常运行:
java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java
请问如何才能让该Java程序稳定在后台运行?
解决思路与方案
1. 重定向标准输入到/dev/null
很多程序后台运行时,若尝试读取标准输入(stdin)会收到EOF信号导致退出。给命令加上输入重定向:
nohup java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java > output.log 2>&1 < /dev/null &
或合并简化:
nohup java -cp "..." EnduserCredentialExample.java &> output.log < /dev/null &
2. 确保工作目录正确
后台运行时可能工作目录异常,导致程序找不到依赖文件。可以在命令前切换到脚本所在目录:
nohup bash -c 'cd "$(dirname "$(readlink -f "$0")")" && java -cp "streamer-client-java.jar:kafka-clients-3.4.0.jar:lz4-java-1.8.0.jar:slf4j-api-2.0.7.jar:snappy-java-1.1.10.0.jar:." EnduserCredentialExample.java' > output.log 2>&1 < /dev/null &
或者直接后台运行你的脚本并处理输入输出:
nohup ./your_script.sh > output.log 2>&1 < /dev/null &
3. 查看日志定位报错
优先检查output.log和error.log,看是否有未捕获的异常、资源加载失败或连接问题,这是定位退出原因最直接的方式。
4. 使用进程管理工具
如果上述方法无效,用screen或tmux维持会话,即使关闭终端进程也能继续运行:
- 安装screen:
sudo apt install screen(Debian/Ubuntu)或yum install screen(CentOS/RHEL) - 启动会话:
screen -S kafka_java - 在会话内执行Java命令,按
Ctrl+A+Ddetach会话 - 后续用
screen -r kafka_java重新连接查看状态
5. 检查程序代码逻辑
查看EnduserCredentialExample.java是否有依赖终端交互、监听终端信号的逻辑,比如读取控制台输入、依赖终端存活的心跳判断,将这些逻辑修改为适配后台运行的模式。
内容的提问来源于stack exchange,提问作者Navaneeth Busha
相关产品推荐
相关产品推荐

