如何重新接入中断会话中仍在运行的调试脚本?
如何重新接入中断会话中仍在运行的调试脚本?
嘿,这种会话断了但进程还在跑的情况我也遇到过好几次!先给你吃个定心丸——你的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
- Debian/Ubuntu系:
- 获取目标进程的PID(就是你
ps输出里的139038这类数字) - 在当前新会话里执行:
reptyr <PID>- 如果进程是root用户运行的,可能需要加
-s参数:reptyr -s <PID> - 要是遇到权限问题,临时关闭ptrace保护(用完记得改回来):
echo 0 > /proc/sys/kernel/yama/ptrace_scope
- 如果进程是root用户运行的,可能需要加
如果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
相关产品推荐
相关产品推荐

