【发布时间】:2016-01-26 21:15:46
【问题描述】:
下面是一个简单的 python 程序,它通过 StdIn 将 rsyslog 数据记录到 py.output.txt。
我的问题是没有将来自 STDin 的数据实时记录到输出中。
如果 ihome.py 作为后台子进程(rsyslog)运行... 没有输出 发送到 py.output.txt 只有当我停止主进程.. py.output.txt 接收输出
当后台进程
当我终止 rsyslog 时,它会向他的子进程 ihome.py 发送一个 EOF .. 这可能会触发数据的实际写出。
当前台进程时
但是,当我将 ihome.py 作为前台进程运行时,py.output.txt 会实时更新,永远是新条目。我不需要关闭 ihome.py 来写出每个新事件。
Bash 输出
>>ps
root 4328 1 0 21:04 ? 00:00:00 /usr/sbin/rsyslogd -c5
root 4360 4328 1 21:04 ? 00:00:00 python/home/pi/script/ishome.py
>>pi@rasp ~/script $ cat py.output.txt
>>pi@rasp ~/script $ sudo service rsyslog stop
[ ok ] Stopping enhanced syslogd: rsyslogd.
>>pi@rasp ~/script $ cat py.output.txt
2016-01-24 21:05:32.112457 :2016-01-24T22:04:22+00:00 192.168.0.198
2016-01-24 21:05:32.113029 :2016-01-24T22:04:33+00:00 192.168.0.198
ihome.py
#!/usr/bin/env python
import sys
from datetime import datetime
filename = open("/home/pi/script/py.output.txt",'a',0)
sys.stdout = filename
for line in sys.stdin:
print (str(datetime.now())+' :'+line)
首先认为 StdIn 被缓冲并且流在关闭时被处理。但是,当我查看处理 StdIn 行的时间时,我清楚地看到 StdIn 是实时处理的。只有写出来的是..没有发生?
我已经用数百个通过 PyMongo 写入 MongoDB 的输入行测试了这个场景。当进程终止时,数据库再次更新。
任何想法都是导致这种延迟写入的原因,我希望每个新事件都实时写入我的输出(无论是数据库还是文件)。
【问题讨论】:
-
尝试刷新流?
标签: python linux shell rsyslog