下面是一个简单的python程序,它通过StdIn将rsyslog数据记录到 py.output.txt 。
我的问题是,没有将实时中的STDin数据记录到输出中。
如果 ishome.py 作为后台子进程(rsyslog)运行... 没有输出发送到 py.output.txt 只有当我停止主进程时.. py.output.txt 才会收到输出
当我终止rsyslog时,它会向他的子进程 ishome.py 发送一个EOF,这可能会触发实际的数据写出。
然而,当我运行 ishome.py 作为前台进程 py.output.txt 时,会实时更新新条目。我不需要关闭 ishome.py 来写出每个新事件。
>>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
#!/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的输入行测试了这个场景。当进程被终止时,db也会被更新。
任何想法造成这种写作延迟的原因,我想把每一个新事件都实时写入我的输出(无论是数据库还是文件)。
答案 0 :(得分:0)
sys.strin.readline()会不断返回并清空字符串,我假设一个只有" / n"
的字符串所以我在我的代码中添加了一个检查来解决这个问题。案件结束: - )
while True:
line = sys.stdin.readline()
if line != "":
result = db.mac.insert_one({"adres":line}) ## My action