我为自定义应用程序创建了一个简单的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)连接到的位置。采取以下之一:继承,null,tty,syslog,kmsg,kmsg + console,syslog + console或socket。
如果设置为继承,则将标准输入的文件描述符复制为标准输出。如果设置为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/messages
可以解决问题。问题是,根据日志,问题是我的守护程序在启动时崩溃,但是我可以告诉它它仍在运行,因为它具有HTTP服务器,并且可以查询它。看来其余的日志都迷路了……
StandardOutput=tty
以便在启动守护程序时可以看到发生了什么。它应该输出终端(可能必须使用ttyS0
或类似方式才能在屏幕上显示输出)。
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
输出?大多数系统都会将内容登录,/var/log/
因此我将从此处进行检查开始。grep
如果您知道输出内容,则可以使用它来搜索文本:grep "my output" /var/log
应该可以解决问题。