我正在编写一个程序来聚合Linux主机上的strace输出行。当strace以“-f”选项运行时,它将混合系统调用行:
close(255 <unfinished ...>
<... rt_sigprocmask resumed> NULL, 8) = 0
<... close resumed> ) = 0
[pid 19199] close(255 <unfinished ...>
[pid 19198] <... rt_sigprocmask resumed> NULL, 8) = 0
[pid 19199] <... close resumed> ) = 0
我想迭代输出并将“未完成”行与“恢复”行组合。所以在输出上面的两行:
close(255 <unfinished ...>
.....
<... close resumed> ) = 0
将合并为:
close(255) = 0
我在考虑将“未完成”的行拆分为“&gt;”并将其放入列表中。如果未来的行包含简历,我将遍历此列表以查看系统调用和pid是否存在。如果他们是我将split()行“&gt;”并将两者结合起来。好奇,如果有更好的方法来做到这一点?
*更新*
感谢您提供的精彩反馈!我想出了以下内容,并希望对代码有所了解:
holding_cell = list()
if len(sys.argv) > 1:
strace_file = open(sys.argv[1], "r")
else:
strace_file = sys.stdin
for line in strace_file.read().splitlines():
if "clone" in line:
print line
if "unfinished" in line:
holding_cell.append(line.split("<")[0])
elif "resumed" in line:
# Get the name of the system call / pid so we can try
# to match this line w/ one in the buffer
identifier = line.split()[1]
for cell in holding_cell:
if identifier in cell:
print cell + line.split(">")[1]
holding_cell.remove(cell)
else:
print line
有更多的pythonic方式来写这个吗?再次感谢您提供的精彩反馈!
答案 0 :(得分:0)
某些迭代器(如文件对象)可以嵌套。假设您正在从类似文件的对象中读取它,您可以创建一个内部循环来进行组合。我不确定strace
日志的格式规则是什么,但名义上,它可能类似于
def get_logs(filename):
with open('filename') as log:
for line in log:
if "<unfinished " in line:
preamble = line.split(' ', 1)[0].strip()
for line in log:
if " resumed>" in line:
yield "{}) = {}\n".format(preamble,
line.split('=')[-1].strip())
break
else:
yield line