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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:12:16