如何在Python中检查文件是否关闭以解决‘text file busy’删除报错?
嗨,这个问题我之前也碰到过——处理pcap文件时偶尔会遇到进程还没释放文件就执行删除的情况,导致「text file busy」错误。下面给你一套完整的bash脚本实现方案,从生成过滤后的pcap,到检查文件状态再安全删除:
1. 用tshark过滤pcap并收集文件名到数组
首先我们先完成第一步:处理大型pcap,过滤出目标数据包并保存,同时把新文件的路径存入数组。你可以根据实际需求修改tshark的过滤规则:
# 初始化存储文件名的数组 filename_array=() # 示例:过滤TCP 80端口的数据包,保存为filtered_tcp80.pcap tshark -r large.pcap -Y "tcp.port == 80" -w filtered_tcp80.pcap # 将文件名加入数组 filename_array+=("filtered_tcp80.pcap") # 可以添加更多过滤任务,比如过滤UDP 53端口 tshark -r large.pcap -Y "udp.port == 53" -w filtered_udp53.pcap filename_array+=("filtered_udp53.pcap")
2. 编写检查文件是否被占用的函数
我们用lsof命令来检测文件是否被进程打开——这个工具能列出系统中所有被打开的文件及对应的进程。下面是封装好的检查函数:
# 检查指定文件是否被任何进程占用 is_file_open() { local target_file="$1" # lsof返回0表示文件被打开,非0则表示未被占用 lsof "$target_file" > /dev/null 2>&1 return $? }
3. 等待所有文件关闭后执行删除
接下来我们写核心逻辑:循环检查数组中的所有文件,直到它们都被释放(或者超时终止),再执行删除操作。这里加入了超时机制,避免无限等待:
# 设置超时时间(单位:秒),可根据实际情况调整 TIMEOUT=300 start_timestamp=$(date +%s) # 循环检查所有文件状态 while true; do all_files_closed=true # 遍历数组中的每个文件 for file in "${filename_array[@]}"; do if is_file_open "$file"; then echo "⚠️ 文件 $file 仍被进程占用,继续等待..." all_files_closed=false break fi done # 所有文件都已关闭,开始删除 if $all_files_closed; then echo "✅ 所有文件已释放,开始执行删除..." break fi # 检查是否超时 current_timestamp=$(date +%s) elapsed_time=$((current_timestamp - start_timestamp)) if [ $elapsed_time -ge $TIMEOUT ]; then echo "❌ 等待超时,部分文件仍未关闭,终止删除操作" exit 1 fi # 每隔2秒检查一次,可调整检查间隔 sleep 2 done # 遍历数组删除所有文件 for file in "${filename_array[@]}"; do if rm -f "$file"; then echo "✅ 成功删除文件: $file" else echo "❌ 删除文件失败: $file" fi done
额外注意事项
- 确保你的系统已经安装了
lsof:Debian/Ubuntu可以用sudo apt install lsof,RHEL/CentOS用sudo yum install lsof。 - 如果文件被特权进程(比如root权限的进程)打开,你需要用
sudo运行脚本,否则lsof可能检测不到该进程。 - 正常情况下tshark执行完成后会自动释放文件,但如果有其他外部进程(比如日志工具、备份脚本)打开了这些pcap,这个检查逻辑就能帮你避免删除错误。
内容的提问来源于stack exchange,提问作者crappidy
相关产品推荐
相关产品推荐

