执行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
相关产品推荐
相关产品推荐

