我目前正在尝试将 systemd 单元制作为 Web 服务器。目前,我的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
事实上,UNIX 中的缓冲取决于上下文:当 stdout 被重定向到像控制台这样的交互式物体时 - 它通常是行缓冲的,否则它是完全缓冲的。
可以使用以下方法在应用程序内部更改缓冲设置缓冲区图书馆电话。
但也可以用标准缓冲区启动时命令:
ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo
(适用于行缓冲情况)
答案2
默认开启Ubuntu 15.04,systemd日志只是易失性的,/run/systemd/journal
每次重启后都会保留并丢失。要使用执着的 systemd日志,您需要创建/var/log/journal
目录(并重新启动 systemd-journald.service)。
因此,stdout
输出可能只是重定向到syslog
,而不是保留在systemd日记。为此,您可能需要使用执着的 systemd日志如上所述。
您检查/var/log/syslog
过您的foo
日志吗?