Фоновый процесс python (= дочерний процесс rsyslog) записывает только при закрытии

Ниже приведена простая программа на Python, которая записывает данные rsyslog через StdIn в py.output.txt.
Моя проблема заключается в том, что данные из STDin не регистрируются в реальном времени на выходе.

Если ishome.py работает как фоновый дочерний процесс (rsyslog)... выходные данные не отправляются в py.output.txt Только когда я останавливаю основной процесс.. py.output.txt получает вывод

Когда фоновый процесс

Когда я завершаю rsyslog, он отправляет EOF его дочернему процессу ishome.py .. и это может вызвать фактическую запись данных.

Когда процесс переднего плана

Однако, когда я запускаю 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

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 обрабатывается в реальном времени. Только запись.. не происходит ?

Я протестировал этот сценарий с сотнями строк ввода, которые записываются в MongoDB через PyMongo. Опять же, база данных обновляется, когда процесс завершается.

Любая идея, что вызывает эту задержку в записи, я хотел бы, чтобы каждое новое событие записывалось в режиме реального времени на мой вывод (будь то БД или файл).


person H Doucet    schedule 24.01.2016    source источник
comment
Попробовать сбросить стрим?   -  person Etan Reisner    schedule 25.01.2016


Ответы (1)


Каким-то образом sys.strin.readline() будет постоянно возвращать пустую строку, я предполагаю, что это строка только с "/n"

Поэтому я добавил проверку в свой код, чтобы решить эту проблему. дело закрыто :-)

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