查看systemd服务的stdout/stderr

查看systemd服务的stdout/stderr

我为自定义应用程序创建了一个简单的 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) 连接到的位置。取其中之一继承,无效的,终端,系统日志,公里信息,公里消息+控制台,系统日志+控制台或者插座

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

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

我只需要这个来进行调试,我可能最终会删除大部分日志并将输出更改为系统日志。

答案1

更新

正如麦克马卡纳指出的那样,系统日志现在是大多数发行版的标准日志记录设备。要查看systemd 单元的stdout和,请使用stderrjournalctl命令。

sudo journalctl -u [unit]

原答案

默认情况下,systemd 单元的stdout和会发送到 syslog。stderr

如果您使用完整的 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

答案2

更短、更简单、非遗留答案:

sudo journalctl -u [unitfile]

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

sudo journalctl --unit=myapp

实时跟踪日志:

sudo journalctl -f -u myapp

相关内容