python脚本无法作为守护程序运行(EOFError:读取行时出现EOF)

时间:2019-03-22 11:46:18

标签: python python-3.x macos launchd

我创建了一个在命令行上可以正常运行的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 :(得分:0)

就其本质而言,守护程序无法从控制台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