能否将非tmux的SSH会话接入已有的tmux会话?
将已运行的任务转移到tmux会话的方法
方法一:使用reptyr工具(最简便)
先安装reptyr:Debian/Ubuntu系统执行
sudo apt install reptyr;CentOS/RHEL系统可通过sudo yum install reptyr或源码编译安装操作步骤:
- 找到要转移的进程ID(PID):用
ps aux | grep 你的任务命令或pgrep 命令名,比如pgrep python就能定位Python任务的PID - 在服务器上新建或进入tmux会话:执行
tmux new -s mysession创建新会话,已有会话则用tmux attach -t mysession进入 - 在tmux会话里执行转移命令:
reptyr <PID>,比如reptyr 12345 - 验证:原SSH窗口的任务会自动转移到tmux中,此时关闭原SSH连接,任务仍会在tmux后台持续运行
- 找到要转移的进程ID(PID):用
注意:reptyr需要进程的操作权限,你自己启动的任务一般都能正常转移;部分带复杂终端交互的进程可能出现小问题,但编译、数据处理这类耗时任务基本都能稳定运行
方法二:手动转移(无需额外工具)
如果服务器无法安装第三方工具,可尝试这个方法:
- 先记录目标进程的PID,比如
pid=12345 - 暂停进程:
kill -STOP $pid - 在tmux中启动和原环境一致的shell(比如bash)
- 在tmux的shell里执行:
gdb -p $pid - 在gdb提示符下依次输入以下命令:
call setsid() call dup2(open("/dev/null", 0), 0) call dup2(open("/dev/null", 1), 1) call dup2(open("/dev/null", 2), 2) detach quit - 恢复进程运行:
kill -CONT $pid - 此时进程已脱离原SSH终端,会在tmux会话的后台继续执行,关闭原窗口不会中断任务
- 注意:这个方法操作较复杂,对交互式任务的支持有限,更适合非交互类的耗时任务
内容的提问来源于stack exchange,提问作者Sunny An
相关产品推荐
相关产品推荐

