15.04上的systemd不会记录单元的标准输出


12

我目前正在尝试将systemd单元用作网络服务器。目前,我的foo.service文件如下所示:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

foo可执行文件会自动将所有HTTP请求记录到stdout-这是经过充分测试的。但是,当我使用查看日志时journalctl -u foo,只会得到如下输出:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

有人可以解释为什么它不记录所有stdout输出吗?我简要地看了这个先前的问题,但这没有帮助-但是它暗示了“ ...可能不适用于未使用完整 systemd的系统”的思路-Ubuntu 15.04会遇到这种情况?预先感谢您,对此将提供任何帮助!


1
确保您的进程没有缓冲输出。我遇到了类似的问题,并且通过禁用python脚本的输出缓冲解决了该问题。由于生成的日志记录数量不多,因此似乎没有日志记录,但是实际上,它还没有机会,因为所有日志记录仍收集在stdout输出缓冲区中。
2015年

1
试图解决这个问题。我的印象是systemd确实在缓冲。stdout在UNIX中是行缓冲的,但是systemd会做自己的事情,并缓冲更多(为了快速但可能没用)。
Velkan

我遇到了同样的问题,并且使用Python的print函数进行缓冲是问题所在!因为我使用的是Python 3,所以我只用了类似的方法print('Hello World!', flush=True),就成功了!输出开始显示在journalctl中。
timbram

Answers:


9

实际上,在UNIX中进行缓冲取决于上下文:当stdout重定向到诸如控制台之类的交互对象时-通常是行缓冲的,否则它是完全缓冲的。

可以使用setvbuf库调用在应用程序内部更改缓冲。

但是也可以在启动时使用stdbuf命令来完成:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(对于行缓冲的情况)


这挽救了我的一天!非常感谢你。但是,我有点困惑ExecStart=/my/foo/program,为什么在终止服务时不刷新标准输出日志,而是完全消失了。
wlnirvana

0

Ubuntu 15.04上,默认情况下,systemd日志仅是易失性的,会保留在其中,/run/systemd/journal并且每次重新启动时都会丢失。要使用持久化 systemd日志,您需要创建/var/log/journal目录(并重新启动systemd-journald.service)。

因此,可能stdout只是将输出重定向到syslog而不保留在系统日志中。为此,您可能需要使用如上所述的持久 系统日志。

您检查/var/log/syslogfoo日志了吗?


/var/log/journal正如您提到的,我创建了,但是无论如何我都没有看到systemd服务的标准输出。在/var/log/syslog我看不到它。
注销
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.