【问题标题】:A python background process (= child of rsyslog process) ... only write on closepython 后台进程(= rsyslog 进程的子进程)...仅在关闭时写入
【发布时间】: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


【解决方案1】:

sys.strin.readline() 会如何不断返回并为空字符串,我假设字符串只有“/n”

所以我在我的代码中添加了一个检查 .. 来解决这个问题。案例关闭:-)

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

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2016-05-21
    • 2020-03-28
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多