如何访问并复用无终端关联的运行中Bash进程以恢复崩溃Shell的历史记录
我来帮你搞定这个问题——要找回崩溃Shell丢失的历史记录,核心就是重新连接到那些脱离终端的Bash进程,下面一步步来操作:
1. 定位目标Bash进程
首先得精准找到那些“无家可归”的Bash进程,你已经用到了ps -AFlwwc,可以用更聚焦的命令筛选:
运行:
ps -AFlwwc | grep bash
在输出里找TTY列是?(无终端关联)或者ttyS1的进程,记下它们的PID(输出第二列的数字,是进程的唯一标识)。
2. 用reptyr重新连接到进程
reptyr是专门用来把运行中的进程重新附加到当前终端的工具,完美适配这个场景:
- 先安装reptyr:
- Debian/Ubuntu系:
sudo apt install reptyr - Fedora/RHEL系:
sudo dnf install reptyr
- Debian/Ubuntu系:
- 连接目标进程:
把sudo reptyr <你的PID><你的PID>替换成刚才记下的数字。
注意:如果遇到ptrace权限报错,先临时关闭系统的ptrace限制:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope操作完成后可以改回默认值:
echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope
连接成功后,你就会进入那个之前崩溃的Shell环境,它的历史记录还完整保存在内存里!
3. 导出并恢复历史记录
进入旧Shell后,先确认历史:history,然后把历史导出到文件备份:
history -w ~/recovered_bash_history.txt
之后退出这个旧Shell,在新的Konsole窗口里导入历史:
history -r ~/recovered_bash_history.txt
额外提示:避免以后再丢历史
为了防止下次Shell崩溃丢失历史,你可以修改Bash配置,让它实时写入历史。打开~/.bashrc文件,添加一行:
PROMPT_COMMAND='history -a'
保存后执行source ~/.bashrc生效,这样每次执行完命令,历史都会立刻追加到~/.bash_history里,就算崩溃也只会丢失最后一条命令。
另外补充下:你最初问的控制/dev/pts/nn号的问题,其实系统的pts设备是动态分配的,没法手动指定固定编号,但通过恢复旧进程的方式,完全不需要纠结pts号,直接复用旧进程的环境和历史就好啦。
备注:内容来源于stack exchange,提问作者Anton Wessel

