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

如何重新接入中断会话中仍在运行的调试脚本?

如何重新接入中断会话中仍在运行的调试脚本?

嘿,这种会话断了但进程还在跑的情况我也遇到过好几次!先给你吃个定心丸——你的Python脚本确实还在后台正常运行,现在要重新接入它的交互式界面,得分两种情况来看:

一、如果当初你是用会话管理工具(screen/tmux)启动的脚本

这是最理想的情况,直接就能捡回之前的会话:

  • 先列出当前正在运行的会话:
    • 用screen的话,执行 screen -list
    • 用tmux的话,执行 tmux list-sessions
  • 找到对应脚本的会话ID或名称后,直接重新接入:
    • screen:screen -r <会话ID/名称>
    • tmux:tmux attach-session -t <会话ID/名称>
      这样就能回到之前的调试界面,和没断开时一模一样。

二、如果当初没用到会话管理工具,进程已经裸奔在后台

这种情况没法直接“转移”会话,但可以用工具接管进程的输入输出,最方便的是reptyr:

  • 先安装reptyr(不同系统命令不同):
    • Debian/Ubuntu系:apt install reptyr
    • RHEL/CentOS系:yum install reptyr
  • 获取目标进程的PID(就是你ps输出里的139038这类数字)
  • 在当前新会话里执行:reptyr <PID>
    • 如果进程是root用户运行的,可能需要加-s参数:reptyr -s <PID>
    • 要是遇到权限问题,临时关闭ptrace保护(用完记得改回来):echo 0 > /proc/sys/kernel/yama/ptrace_scope

如果reptyr用不了,还可以用gdb应急(操作稍复杂):

  • 先查看当前终端的设备文件:tty,会输出类似/dev/pts/0的路径
  • 启动gdb并附加到目标进程:gdb -p <PID>
  • 在gdb命令行依次输入:
    call dup2(open("/dev/pts/0", 0), 0)
    call dup2(open("/dev/pts/0", 1), 1)
    call dup2(open("/dev/pts/0", 2), 2)
    detach
    quit
    
    把上面的/dev/pts/0换成你tty命令得到的路径就行,这样进程的输入输出就会转到当前终端了。不过这个方法可能会影响进程的信号处理,优先用reptyr。

最后给个小建议

以后跑长时间调试、后台执行的脚本,一定要提前用screen或tmux启动!就算SSH会话突然断了,重新连上去就能无缝继续,再也不用折腾这些补救办法啦。

备注:内容来源于stack exchange,提问作者Qohelet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:12:34