一个python后台进程(= rsyslog进程的子进程)...只写在关闭

时间:2016-01-24 22:11:43

标签: python linux shell rsyslog

下面是一个简单的python程序,它通过StdIn将rsyslog数据记录到 py.output.txt
我的问题是,没有将实时中的STDin数据记录到输出中。

如果 ishome.py 作为后台子进程(rsyslog)运行... 没有输出发送到 py.output.txt 只有当我停止主进程时.. py.output.txt 才会收到输出

BackGround Process

当我终止rsyslog时,它会向他的子进程 ishome.py 发送一个EOF,这可能会触发实际的数据写出。

ForeGround Process

然而,当我运行 ishome.py 作为前台进程 py.output.txt 时,会实时更新新条目。我不需要关闭 ishome.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

ishome.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的输入行测试了这个场景。当进程被终止时,db也会被更新。

任何想法造成这种写作延迟的原因,我想把每一个新事件都实时写入我的输出(无论是数据库还是文件)。

1 个答案:

答案 0 :(得分:0)

sys.strin.readline()会不断返回并清空字符串,我假设一个只有" / n"

的字符串

所以我在我的代码中添加了一个检查来解决这个问题。案件结束: - )

while True:
    line = sys.stdin.readline()
    if line != "":
        result = db.mac.insert_one({"adres":line}) ## My action