SSH远程执行Jar包启动命令后终端无法退出或Jar包未正常运行的问题求助
解决SSH远程运行Jar包后台启动的问题
我来帮你拆解下问题根源,以及给出可行的修复方案:
核心错误1:两个sudo命令未正确分隔
看你写的远程命令串:
sudo chmod 777 /home/ubuntu/task.jar sudo nohup java -jar /home/ubuntu/task.jar >> /home/ubuntu/nohup.out &
这里两个sudo命令之间没有任何分隔符(比如分号;或者逻辑与&&),远程shell会把第二个sudo当成chmod命令的参数处理,直接导致chmod执行失败,后面的nohup命令根本没机会启动——这就是加了&后终端恢复,但Jar包没运行的关键原因。
次要问题:-tt参数的干扰
你使用了ssh -tt,这个参数会强制给远程会话分配伪终端。当你把命令放到后台(加&),SSH会话结束时,远程shell会向后台进程发送SIGHUP终止信号,即便有nohup,伪终端的存在也可能让信号处理不符合预期,导致进程被带终止。
正确的命令写法
方式1:基础修复(无需交互式输入sudo密码)
把两个命令用分号分隔,同时去掉不必要的-tt参数,再完善输出重定向:
ssh -i keyFile ubuntu@IP 'sudo chmod 777 /home/ubuntu/task.jar; sudo nohup java -jar /home/ubuntu/task.jar >> /home/ubuntu/nohup.out 2>&1 &'
这里的改进点:
- 用
;分隔两个sudo命令,确保它们依次执行 - 把标准错误流(
2)重定向到标准输出流(1),错误信息也会写入nohup.out,方便后续排查问题 - 去掉
-tt,避免伪终端带来的信号干扰
方式2:需要输入sudo密码的场景
如果你的sudo配置需要输入密码,必须保留-tt来获取交互式终端,那可以在后台运行后加上disown,让进程脱离当前shell的控制:
ssh -tt -i keyFile ubuntu@IP 'sudo chmod 777 /home/ubuntu/task.jar; sudo nohup java -jar /home/ubuntu/task.jar >> /home/ubuntu/nohup.out 2>&1 & disown'
输入密码后按Ctrl+D退出SSH会话,Jar包就会持续在后台运行了。
额外安全建议
给Jar包设置777权限过于宽松,存在安全风险,建议只给所有者分配执行权限即可:
sudo chmod u+x /home/ubuntu/task.jar
这样完全足够让Java程序运行它。
内容的提问来源于stack exchange,提问作者Kohini
相关产品推荐
相关产品推荐

