服务器负载突增排查编程题求助:进程日志分析代码修正
问题描述
某服务器在时刻t的指标显示负载突增,需查看进程状态日志找出导致负载上升的进程。服务器存在A至H共8个进程,每个进程有created、waiting、running、terminated四种状态,日志开始记录时所有进程均处于terminated状态,日志包含了截至时刻t的所有进程状态变更记录。
要求:
- 若时刻
t仅存在一个处于running状态的进程,输出该进程名称; - 若没有进程处于
running状态或存在多个running状态的进程,则输出-1。
示例:
输入:
15, ["0 A created", "1 B created", "10 A running", "12 B waiting", "13 B running", "14 A waiting", "17 B terminated", "18 A terminated"]
输出:"B"
我的代码
# you can write to stdout for debugging purposes, e.g. # print("this is a debug message") def solution(t, logs): new_logs = [item.split(' ') for item in logs ] temp = [] final = [] for item in new_logs: if item[2] == "running" and int(item[0]) <= t: temp.append(item[1]) if item[2] == 'terminated' and item[1] in temp and int(item[0])> t: temp.remove(item[1]) final.append(item[1]) print(temp, final) if len(final) >= 2: return '-1' elif len(final) == 1: return str(final[0]) else: return '-1'
问题分析与修正
原代码逻辑存在漏洞:只处理了running和terminated状态,忽略了waiting状态会让进程退出running状态的情况;同时temp和final的使用逻辑混乱,无法准确跟踪进程在t时刻的真实状态。
正确的思路应该是跟踪每个进程在t时刻的最终状态——因为日志是截至t的所有变更记录,所以进程最后一次时间<=t的状态变更,就是它在t时刻的状态。
修正后的代码
def solution(t, logs): # 初始化所有A-H进程的初始状态为terminated process_states = {chr(ord('A') + i): 'terminated' for i in range(8)} # 遍历日志,更新进程截至t时刻的状态 for log in logs: time_str, proc, state = log.split(' ') time = int(time_str) if time > t: continue process_states[proc] = state # 统计当前处于running状态的进程 running_procs = [proc for proc, state in process_states.items() if state == 'running'] # 根据规则返回结果 if len(running_procs) == 1: return running_procs[0] else: return '-1'
代码说明
- 初始化所有进程状态为
terminated,符合题目中日志开始前的状态设定; - 遍历日志时只处理时间<=t的记录,用最新的状态覆盖进程之前的状态,确保得到的是
t时刻的真实状态; - 统计所有
running状态的进程,根据数量直接返回对应结果,逻辑清晰且覆盖所有边界情况。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

