You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无法通过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+D detach会话
  • 后续用screen -r kafka_java重新连接查看状态

5. 检查程序代码逻辑

查看EnduserCredentialExample.java是否有依赖终端交互、监听终端信号的逻辑,比如读取控制台输入、依赖终端存活的心跳判断,将这些逻辑修改为适配后台运行的模式。


内容的提问来源于stack exchange,提问作者Navaneeth Busha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:37