скрипт python не запускается как демон (EOFError: EOF при чтении строки) - PullRequest
0 голосов
/ 22 марта 2019

Я создал скрипт python3, который отлично работает в командной строке, но когда я пытаюсь работать как демон в MacosX, выдает ошибку «EOFError: EOF при чтении строки». В основном код выглядит следующим образом:

  (...)

  def main():

    # Connect
    port, speed = connect_port()

    device = XBeeDevice(port, speed)

    try:
      device.open()
      # print("Waiting for data...\n")

     (...)

      device.add_packet_received_callback(packet_received_callback)
      input()

    finally:
      if device is not None and device.is_open():
        device.close()

  if __name__ == '__main__':
    main()

plist выглядит нормально, так как скрипт запускается и запускается один раз, прежде чем выдать ошибку:

Traceback (most recent call last):
File "/maslestorres.cat/jardiNet_datalogger.py", line 214, in <module>
main()
File "/maslestorres.cat/jardiNet_datalogger.py", line 206, in main
input()
EOFError: EOF when reading a line

Так что в принципе я не знаю, как адаптировать строку input (), чтобы она работала как демон. Python - это версия 3.7.2, а MacOSX - 10.8.5.

1 Ответ

0 голосов
/ 22 марта 2019

По своей природе демон не может input() с консоли.Вам нужен другой способ приостановить основной поток на неопределенный срок, позволяя XBee PacketListener thread продолжать выполнять обратные вызовы.

Самый простой способ сделать это - заменить input() на:

while True:
    time.sleep(1000000)    # arbitrarily large number

Когда придет время завершить работу, менеджер службы вашей системы остановит вашего демона:

  • либо отправив SIGTERM - в этом случае ваш демон будет немедленно завершен,без выполнения блока finally;
  • или путем отправки SIGINT - в этом случае исключение KeyboardInterrupt будет выходить за пределы time.sleep(1000000), и будет работать блок finally.

В любом случае ваш процесс должен быстро остановиться.

Для более правильного решения, способного также изящно обрабатывать SIGTERM, см. Здесь: https://stackoverflow.com/a/46346184/200445

...