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

执行ssh username@ip 'bash test.sh'命令后shell卡住无法退出是什么原因

问题产生原因
  • SSH远程执行命令的默认退出逻辑是等待所有关联进程的stdin、stdout、stderr三个文件描述符全部关闭后,才会终止本地SSH进程,不会仅因为前台脚本执行完成就自动退出。
  • Tmux分离模式(-d参数启动)的进程会继承父shell的标准输入、输出、错误流文件描述符,并且作为长期运行的后台进程,不会主动释放这些文件描述符。即使你脚本里的所有命令已经执行完成、tmux会话和Django服务都正常启动,SSH也会因为检测到还有活跃进程持有流句柄而持续挂住,不会自动退出。
可行修复方案

你可以任选一种方案解决卡住的问题:

  • 调整脚本中tmux启动命令,主动将输出重定向到空设备,释放流句柄:
    修改tmux new-session -s django -d为tmux new-session -s django -d > /dev/null 2>&1
  • 执行SSH命令时添加-f参数,让SSH在远程命令执行后直接转入后台运行,不需要等待流关闭:
    调整本地执行命令为ssh -f username@ip 'bash test.sh'
  • 在test.sh脚本末尾添加一行主动关闭所有流的命令,强制释放所有句柄:
    exec >&- 2>&- <&-
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:10