psutil获取进程create_time异常及运行时长计算问题咨询
使用psutil获取应用最长运行时长的常见问题解析
问题背景
用户使用以下Python代码尝试统计各应用的最长运行时长:
import psutil import time def main(): process_dict = {} psutil.process_iter.cache_clear() processes = psutil.process_iter() for process in processes: duration = time.time() - process.create_time() if process.name() not in process_dict.keys(): # 记录每个应用的最长运行时长 process_dict[process.name()] = duration elif process.name() in process_dict.keys() and duration > process_dict[process.name()]: process_dict[process.name()] = duration print(f'{process.name()} : {process.create_time()}')
运行后得到的部分输出如下:
System Idle Process : 0.0 System : 0.0 : 1722366605.6514304 Registry : 1722366605.7470324 WidgetService.exe : 1722646907.9835372 MoUsoCoreWorker.exe : 1722366742.625491 smss.exe : 1722366607.7051022 csrss.exe : 1722366616.5462563 svchost.exe : 1722366619.7795236 ...
用户提出三个核心疑问:
- 为何System Idle Process和System的
create_time()返回0.0?这意味着它们已运行54年,显然不符合实际。 - 第三个进程名称为空字符串,这个无名进程是什么?
- 部分进程计算出的时长(如82小时)远超实际(每日关机,进程时长应小于24小时),原因是什么?
问题解答
1. System Idle Process和System的create_time()返回0.0的原因
这两个是Windows系统最底层的核心进程,它们的创建时间被系统硬编码为Unix纪元起始点(1970年1月1日,对应时间戳0.0)。因为它们是系统启动时第一个被初始化的进程,Windows内核并未为它们记录真实的创建时间戳,而是用0作为占位符。要获取它们的实际运行时长,应该以系统启动时间为基准,而非直接使用time.time() - create_time()计算。
2. 空名称进程的本质
这种无名进程通常是以下两种情况之一:
- 系统内核级临时进程/线程:比如刚启动还未完成名称初始化的进程,或者即将退出的短命进程;
- 权限限制:当前运行Python程序的用户没有足够权限读取该进程的名称信息,比如某些受系统保护的内核进程。
你可以通过打印该进程的pid,在任务管理器中查看对应PID的进程详情,基本都是系统级的临时进程,无需过度关注。
3. 进程时长远超实际运行时间的原因
主要有三个常见因素:
- PID复用:Windows会回收已退出进程的PID,新启动的进程可能会复用旧PID,此时
create_time()会保留旧进程的时间戳,导致计算出的时长错误; - 快速启动(Fast Startup):如果开启了Windows快速启动功能,系统关机时会将内核状态保存到硬盘,下次开机直接恢复,部分系统进程的
create_time()会保留上次开机时的时间戳,导致时长计算远超实际开机时间; - 服务托管进程:比如
svchost.exe会托管多个系统服务,当某个服务重启时,svchost进程本身不会退出,而是重新加载服务模块,此时create_time()记录的是svchost进程的启动时间,而非单个服务的实际运行时间。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

