Eri*_*ric 4 python python-3.x raspberry-pi systemd raspbian
我使用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
Run Code Online (Sandbox Code Playgroud)
该重定向>>无效.我已经尝试了大多数可用的选项StandardOutput,StandardError但他们从未最终将我的脚本输出打印到/var/log/daemon.log,journalctl -u mydaemon.service只显示有关正在启动和停止的服务的消息.
我目前没有对脚本中的文件描述符做任何有趣的事情.我只是想让我的print()或logging.info()陈述出现在我可以阅读的地方.有任何想法吗?
(为了清楚起见,守护进程必须以root身份运行.这可能与我的打印问题有关吗?)
@mark-stosberg 接受的答案是关于金钱和正确的。我想稍微扩展一下他的答案,但评论太短了。
该systemd-journald.service手册页提到这在流测井部分:
systemd 服务管理器默认调用所有带有标准输出和标准错误的服务进程连接到日志。这种行为可以通过
StandardOutput=/StandardError=unit 文件设置来改变,详见systemd.exec(5)。
所以在@eric 的原始单元文件中,为了获得输出,/home/pi/mydaemon.log您可以在单元文件中执行此操作
ExecStart=/usr/bin/python -u /home/pi/sources/mydaemon.py
StandardOutput=file:/home/pi/mydaemon.log
StandardError=inherit
Run Code Online (Sandbox Code Playgroud)
注意 的值StandardError。这是来自systemd.exec(5) 联机帮助页,这意味着将stderr挂钩到与stdout相同的句柄,就像 2>&1在 shell 语法中一样。
此外,如果您希望日志立即更新,您必须告诉 Python 不要缓冲输出(使用它的-u开关)。这就是为什么我也改变了ExecStart=。当流式传输 python 输出时(无论是在 systemd 中还是从 shell 中),默认情况下输出是缓冲的,并且在缓冲区刷新或进程结束之前不会更新文件。
更新 20190411 - Raspbian 的早期版本 systemd 不接受file:/目标StandardOutput(感谢 @nak 指出这一点),所以我的回答对于 Raspbian 的 OP 问题并不真正有效(我在 openSUSE Tumbleweed 中进行了测试)。 这个 SO 问题“如何将 systemd 服务的输出重定向到文件”详细介绍了使用较旧的 systemd 执行此操作的替代方法。
通常你只是直接运行一个服务(确保它的可执行文件有一个 shebang 行):
ExecStart=/home/pi/sources/mydaemon.py
Run Code Online (Sandbox Code Playgroud)
并使用默认重定向StandardOutput=到 systemd 日志,因此您可以使用journalctl -u mydaemon.service.
Systemd 可以很好地为您控制日志的文件增长和文件轮换。
您的服务以 root 身份运行与此无关。
如果您没有看到上述任何日志输出,还请检查整个日志以查找附近可能归因于您的服务的日志:
journalctl
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为存在一个已知问题,即在脚本存在之前的最后几行日志记录可能不会归因于脚本。对于在退出前仅运行几分之一秒的脚本而言,这一点尤其明显。
我需要使用-u参数运行python以确保消息不被缓冲.
使用这些行,打印行将立即添加到日志中:
StandardOutput=journal+console
ExecStart=/home/pengman/scripts/mqtt_monitor/venv/bin/python -u home/pengman/scripts/mqtt_monitor/src/mqtt_monitor.py
Run Code Online (Sandbox Code Playgroud)
(我在virtualenv里面跑,但这不重要)
| 归档时间: |
|
| 查看次数: |
4254 次 |
| 最近记录: |