我运行了命令PROGRAM 2> log.txt
,
它将连续将输出写入log.txt。
并且输出将在同一行,因为每个输出最后只有\r
。
我正试图以这种方式阅读log.txt,truncate
清除我读过的数据。
read_in_file = open(in_file, 'r')
records = []
for new_item in self.__get_matched_line(read_in_file):
records.append(new_item)
read_in_file.truncate()
read_in_file.close()
return records
但它有一些问题,我有时会得到已读数据。
该程序可能会持续数周。并且每0.5秒输出一次
答案 0 :(得分:0)
您的PROGRAM
将在输出文件上打开一个文件句柄;因此,即使您从外部截断文件,无论文件被截断如何,文件句柄都将写入其旧位置。结果将是截断前的原始长度文件(间隙用零填充,如果选择此路径,可以阅读稀疏文件以获取更多详细信息)。你可以通过关闭文件句柄并为每一行重新打开它来绕过它。最好在PROGRAM
内完成。如果你不能改变它,你可以逐行阅读(由'\r'
分隔)并将整行附加到你的日志文件中:
PROGRAM |& while IFS= read -e -d $'\r' line; do echo "$line" >> log.txt; done
如果您真的只希望以这种方式记录stderr,请使用以下模式:
(PROGRAM 2>&1 1>&3 | while IFS= read -e -d $'\r' line; do echo "$line" >> log.txt; done) 3>&1
这样,日志文件中的truncate
将具有所需的效果。
但请注意,使用truncate
只会在保留开头的同时从文件的 end 中删除内容。如果只使用一个文件,则在删除开头时无法保持结束。因此,如果截断整个文件(将其设置为0字节),则使用truncate
删除已读取的部分是有意义的。
因此,您可能需要考虑日志轮换。这是一个定义明确的过程,可能比你的方法有优势(并且只有有设施已经为你做了)。