Ниже приведена простая программа на 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. Опять же, база данных обновляется, когда процесс завершается.
Любая идея, что вызывает эту задержку в записи, я хотел бы, чтобы каждое новое событие записывалось в режиме реального времени на мой вывод (будь то БД или файл).