如何通过/proc文件描述符读取已打开文件?求脚本报错修复方法
问题分析与修复方法
你的脚本问题出在cat script.txt这个命令上——它会快速读取完文件内容,然后立即关闭文件描述符并退出进程。等你执行sleep 1后,目标进程已经终止,/proc文件系统中对应的PID目录已被清理,自然找不到/proc/$pid/fd/3,kill命令也会因为进程不存在报错。
要实现“保持文件打开状态”的需求,你需要让目标进程打开文件后持续运行,不立即退出。下面是修复后的脚本:
#!/bin/bash echo "Hello, world!" > script.txt # 启动一个保持文件打开的子进程:用exec绑定fd3到目标文件,然后挂起进程 bash -c 'exec 3< script.txt; sleep infinity' & pid=$! # 短暂等待确保文件描述符已成功打开 sleep 0.1 # 通过/proc读取目标进程的fd3 cat "/proc/$pid/fd/3" # 终止子进程 kill $pid
关键说明:
exec 3< script.txt:在子bash进程中,将script.txt以只读方式绑定到文件描述符3,这个描述符会一直保持打开状态,直到进程终止。sleep infinity:让子进程持续挂起,不会自动退出,确保进程和文件描述符始终存在,直到你手动kill它。- 不需要
sleep 1这么久,sleep 0.1足够确保文件描述符完成绑定。
你也可以用其他方式实现类似效果,比如用tail -f script.txt &(tail会持续监控文件,保持fd打开),但上面的exec + sleep infinity方式更直接,能明确控制文件描述符的绑定逻辑。
内容的提问来源于stack exchange,提问作者Иван Мориков
相关产品推荐
相关产品推荐

