如何从 Raspbian 上的 systemd 服务正确重定向 stdout/stderr?

新手上路,请多包涵

我使用 systemd 在 Raspbian (Jessie) 上设置了一项服务,使其在启动后启动。守护进程配置如下所示:

 [Unit]
After=multi-user.target

[Service]
Type=idle
User=root
ExecStart=/bin/sh -c "exec /home/pi/sources/mydaemon.py >> /home/pi/mydaemon.log 2>&1"

[Install]
WantedBy=multi-user.target

该重定向 >> 不起作用。我已经尝试了 StandardOutputStandardError 可用的大部分选项,但它们永远不会将我的脚本输出打印到 /var/log/daemon.log 和 journalctl -u mydaemon.service 仅显示有关正在启动和停止的服务的消息。

我目前没有对脚本中的文件描述符做任何有趣的事情。我只希望我的 print()logging.info() 陈述出现在我可以阅读的地方。有任何想法吗?

(需要说明的是,守护进程确实必须以 root 身份运行。这可能与我的打印问题有关吗?)

原文由 Eric 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 610
2 个回答

通常你只是直接运行一个服务(确保它的可执行文件有一个 shebang 行):

  ExecStart=/home/pi/sources/mydaemon.py

并使用 StandardOutput= 的默认重定向到 systemd 日志,因此您可以使用 journalctl -u mydaemon.service 读取日志。

Systemd 可以很好地为您控制日志的文件增长和文件轮换。

您的服务以 root 身份运行是无关紧要的。

如果您没有看到上面的任何日志输出,还请检查整个日志以查找可能归因于您的服务的附近日志:

  journalctl

这是必要的,因为存在一个已知问题,即脚本存在之前的最后几行日志记录可能不会归因于该脚本。这对于在退出前只运行几分之一秒的脚本来说尤其明显。

原文由 Mark Stosberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

我需要使用 -u 参数运行 python 以确保消息未被缓冲。

使用这些行,打印行会立即添加到日志中:

 StandardOutput=journal+console
ExecStart=/home/pengman/scripts/mqtt_monitor/venv/bin/python -u home/pengman/scripts/mqtt_monitor/src/mqtt_monitor.py

(我在 virtualenv 中运行,但这无关紧要)

原文由 Pengman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题