Java应用退出后远程进程随即终止的问题求助
解决远程进程随Java应用退出终止的问题
你的推测完全正确:远程进程会跟着Java应用退出而终止,核心原因是JSch创建的shell通道关闭时,远程bash会话会终止,并向其下属所有子进程发送SIGHUP信号,直接导致./st.cmd进程被杀死。以下是几种直接可行的解决方法:
方法1:用nohup让进程脱离终端控制
nohup是Linux系统默认自带的工具,专门用于让进程忽略SIGHUP信号,同时将进程转到后台运行,即使终端关闭也能持续执行。修改你的命令为:
shellStream.println("nohup ./st.cmd > /dev/null 2>&1 &");
> /dev/null:将进程的标准输出重定向到空设备,避免自动生成nohup.out日志文件占用磁盘2>&1:将错误输出也重定向到同一目标,统一处理所有输出&:让进程在后台运行,不会阻塞当前shell会话
方法2:用disown分离进程与shell会话
如果不想依赖nohup,可以在启动进程后用disown命令,让进程脱离当前shell的进程组,这样shell退出时不会向它发送终止信号:
shellStream.println("./st.cmd & disown");
这种方式更轻量,但进程的输出会随原终端关闭而丢失,适合不需要保留日志的场景。
方法3:用screen创建独立会话(适合需后续交互的场景)
如果之后需要重新连接到./st.cmd的终端界面操作,可以用screen工具创建独立会话,原shell关闭后,会话内的进程依然正常运行:
shellStream.println("screen -dmS st_session ./st.cmd");
-d:让会话在后台静默运行-m:强制创建新会话-S st_session:给会话命名,后续可通过screen -r st_session命令重新连接到进程终端
额外注意事项
nohup是系统默认自带工具,screen若未安装可通过apt install screen命令在Debian上安装- 如果
./st.cmd是交互式脚本,优先选择screen方案;无交互需求则用nohup更简洁 - 使用上述方法后,即使关闭
shellChannel,远程进程也会持续运行,你原代码中的shellStream.close()操作无需修改
内容的提问来源于stack exchange,提问作者Dia Sheikh
相关产品推荐
相关产品推荐

