我为自定义应用程序创建了一个简单的 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
和,请使用stderr
journalctl
命令。
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