Я также подозреваю, что причина в том, что rsyslog не завершается. readlines()
не должен возвращаться, пока не достигнет реального EOF. Но почему сценарий оболочки действует иначе? Возможно, использование / dev / stdin является причиной. Попробуйте эту версию и посмотрите, работает ли она без зависаний:
#!/bin/sh
cat >> /tmp/testrsyslogomoutput.txt
Если это что-то изменит, у вас также будет исправление: откройте и читайте / dev / stdin из python вместо sys.stdin.
Редактировать: Итак, cat
каким-то образом читает все, что ожидает в stdin, и возвращает, но python блокирует и ждет, пока stdin не будет исчерпан. Странный. Вы также можете попробовать заменить readlines()
на один read()
с последующим split("\n")
, но на данный момент я сомневаюсь, что это поможет.
Итак, забудьте о диагнозе и давайте попробуем обойти эту проблему: заставить стандартный ввод ввода-вывода неблокировать. Следующее должно сделать это:
import fcntl, os
# Add O_NONBLOCK to the stdin descriptor flags
flags = fcntl.fcntl(0, fcntl.F_GETFL)
fcntl.fcntl(0, fcntl.F_SETFL, fl | os.O_NONBLOCK)
message = sys.stdin.read().split("\n") # Read what's waiting, in one go
fd = open('/tmp/testrsyslogomoutput.txt', 'a')
fd.write("Receiving log message : \n%s\n" % ('-'.join(message)))
fd.close()
Вы, вероятно, хотите использовать это в сочетании с python -u
. Надеюсь, что это работает!