Python if-else循环执行异常,无法统计core-dump文件创建次数求助
问题分析与解决方案
你的代码核心问题在于**b_core变量没有在每次循环中重置**,第一次检测到重复后它就一直是'false',导致后续新创建的core文件(即使创建时间不同)也无法被添加到记录里。另外,判断文件是否已记录的逻辑过于繁琐,容易引发错误。
具体问题拆解:
- 当你删除旧core文件并新建后,新文件的
ctime本应是全新的时间,但你的代码在第一次循环后把b_core设为'false',之后每次循环都没有重置这个变量,所以即使新文件时间不在coredumps列表里,也不会执行添加操作。 - 遍历
coredumps的逻辑存在漏洞:只要有一个元素和当前时间匹配,就设b_core='false',但这个判断逻辑完全可以用更简洁的方式实现,没必要绕这么大的弯子。
修正后的代码:
import os import time coredumps = [] times = [] def get_core(): core_file_path = '/xty/tmp/core' # 用文件inode唯一标识文件,比ctime更可靠(避免极端场景下ctime重复) last_inode = None while True: if os.path.exists(core_file_path): current_stat = os.stat(core_file_path) current_inode = current_stat.st_ino current_ctime = current_stat.st_ctime # 若当前inode和上次记录的不同,说明是新创建的文件 if current_inode != last_inode: coredumps.append(current_ctime) tmp_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(current_ctime)) times.append(tmp_time) last_inode = current_inode print(f"记录新的core文件:{tmp_time}") else: # 文件不存在时重置inode标记,确保下次创建新文件能被识别 last_inode = None # 添加小延迟,避免循环占用过多CPU资源 time.sleep(1)
改进说明:
- 用inode替代ctime判断:文件的
st_ino是文件系统中的唯一标识,哪怕极端场景下新文件和旧文件的ctime巧合相同,inode也绝对不同,判断准确性更高。 - 动态重置状态变量:当文件不存在时,自动重置
last_inode,确保下次检测到新创建的core文件时,能被正确识别并记录。 - 简化冗余逻辑:去掉了
b、b_core这类冗余的标志位,用inode直接跟踪文件变化,代码结构更清晰易懂。 - 优化系统资源占用:循环中加入
time.sleep(1),避免高频空循环消耗过多CPU。
测试建议:
运行代码后,手动在/xty/tmp目录下执行创建、删除、再创建core文件的操作,你会发现每次新创建的文件都会被正常记录,不会再出现只打印111的问题。
内容的提问来源于stack exchange,提问作者xiang tianyu
相关产品推荐
相关产品推荐

