查看systemd服务的stdout / stderr


175

我为自定义应用程序创建了一个简单的systemd服务文件。当我手动运行该应用程序时,它运行良好,但是当我使用systemd运行该应用程序时,我的CPU耗尽了。

我正在尝试找出问题所在,但不知道在哪里找到输出(或如何配置systemd将输出放置在某处)。

这是我的服务文件:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

在整个应用程序中,我输出到stdout和stderr。

如何读取守护程序的输出?

编辑:

我发现了man systemd.exec,其中提到了该StandardOutput=选项,但是我不确定如何使用它。从手册页

StandardOutput=

控制已执行进程的文件描述符1(STDOUT)连接到的位置。采取以下之一:继承nullttysyslogkmsgkmsg + consolesyslog + consolesocket

如果设置为继承,则将标准输入的文件描述符复制为标准输出。如果设置为null,则标准输出将连接到/dev/null,即写入其中的所有内容都将丢失。如果设置为tty,则标准输出将连接到tty(通过进行配置TTYPath=,请参见下文)。如果使用TTY输出,则仅执行的过程将不会成为终端的控制过程,也不会失败或等待其他过程释放终端。 syslog将标准输出连接到syslog(3)系统记录器。 kmsg将其与内核日志缓冲区连接,该缓冲区可通过dmesg(1)访问。 syslog +控制台kmsg +控制台工作类似,但也将输出复制到系统控制台。 socket通过套接字激活将标准输出连接到套接字,其语义类似于的相应选项StandardInput=。此设置默认为继承。

这是否意味着这些是我唯一的选择?例如,我想输入输出内容/dev/shm。我想我可以使用Unix域套接字并编写一个简单的侦听器,但这似乎有点不必要。

我只需要使用它进行调试,最终可能会删除大多数日志并将输出更改为syslog。


您是否尝试过检查/var/log/syslog输出?大多数系统都会将内容登录,/var/log/因此我将从此处进行检查开始。grep如果您知道输出内容,则可以使用它来搜索文本:grep "my output" /var/log应该可以解决问题。
sbtkd85 2011年

@ sbtkd85-好吧,我没有/var/log/syslog,但是/var/log/messages可以解决问题。问题是,根据日志,问题是我的守护程序在启动时崩溃,但是我可以告诉它它仍在运行,因为它具有HTTP服务器,并且可以查询它。看来其余的日志都迷路了……
beatgammit 2011年

为什么不尝试设置,StandardOutput=tty以便在启动守护程序时可以看到发生了什么。它应该输出终端(可能必须使用ttyS0或类似方式才能在屏幕上显示输出)。
sbtkd85 2011年

3
标准IO重定向运算符不应该在这种情况下工作。像ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal

实际上是在滥用CPU?它是systemd,您的服务还是系统(例如,由于systemd发疯了,因此生成了服务的新副本)?
彼得2012年

Answers:


183

更新资料

正如mikemaccana指出的那样,systemd日志现在是大多数发行版的标准日志记录设备。要查看systemd单元的stdoutstderr,请使用journalctl命令。

sudo journalctl -u [unit]

原始答案

默认情况下,stdoutstderrsystemd的单位发送到syslog。

如果您使用的是完整的systemd,则可以通过访问journalctl。在Fedora上,应该是,/var/log/messages但是syslog会将其放在您的规则说的地方。

由于文章的日期,并假设暴露于systemd通过Fedora的,你可能是由这里所描述的漏洞打多数人: https://bugzilla.redhat.com/show_bug.cgi?id=754938 它很好地解释了它们如何工作=)(这是selinux-policy中的一个错误,导致错误消息未记录,并已在中修复selinux-policy-3.10.0-58.fc16


5
请注意,使用这样的标准日志记录机制默认情况下不会创建持久日志。为此,您需要创建/ var / log / journal,然后运行sudo systemctl restart systemd-journald
mlissner,2015年

1
什么系统日志功能和优先级?
jrwren 2015年

2
这为我工作:StandardOutput=syslog+consoleStandardError=syslog+console之后,从我单位所有输出出现在journalctl。默认设置显然是错误的。(例如/etc/systemd/system.conf中的DefaultStandardOutput)
gregn3

2
-f对我有帮助。发生更改时遵循日志记录(用例跟踪的是作为守护程序运行的minecraft服务器)
blaughw

2
这让我发疯……在标准的Debian Stretch Journalctl上,我什么也看不到。我什至使用/usr/bin/stdbuf -oL <cmd>和显式StandardOutput=journal。依然没有。
jlh

81

更简短,更简单的非遗留答案:

sudo journalctl -u [unitfile]

其中[unitfile]是系统.service名称。例如,要查看来自的消息myapp.service

sudo journalctl --unit=myapp

要实时跟踪日志:

sudo journalctl -f -u myapp

4
请注意,sudo如果您遇到No journal files found错误,则可能必须这样做。
bigjosh

5
syslog不是旧版...
Miles Rout

2
它在当前的Linux发行版中。您可能真的很喜欢syslog,但这并不会改变它们附带的功能。
mikemaccana

1
当然。并且它也使用syslog。我的意思不是说不使用systemd,而是syslog不是旧版。
迷宫

6
@JECompton如果当前Linux发行版上的所有日志记录都使用日志记录,并且不需要syslog且仅用于兼容性,则从逻辑上讲,syslog是旧的。
mikemaccana
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.