我在 CentOS 7 上有一个新安装的版本,我已经从 EPEL 存储库安装了 syslog-ng。
~: yum list | grep syslog
syslog-ng.x86_64 3.5.6-1.el7 @epel
当我尝试通过 systemctl 启动它时,它失败如下:
/usr/lib/systemd/system: systemctl start syslog-ng
Job for syslog-ng.service failed. See 'systemctl status syslog-ng.service' and 'journalctl -xn' for details.
在查看日志时,我们可以看到它们依赖于套接字,该套接字“启动”正常,但该过程返回一个有关参数不正确的错误,如下所示:
May 07 17:26:15 superserver.company.corp systemd[1]: Starting Syslog Socket.
May 07 17:26:15 superserver.company.corp systemd[1]: Listening on Syslog Socket.
May 07 17:26:15 superserver.company.corp systemd[1]: Starting System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
May 07 17:26:15 superserver.company.corp systemd[1]: Failed to start System Logger Daemon.
May 07 17:26:15 superserver.company.corp systemd[1]: Unit syslog-ng.service entered failed state.
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service holdoff time over, scheduling restart.
May 07 17:26:15 superserver.company.corp systemd[1]: Stopping System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: Starting System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
如果我们查看服务配置文件,我们可以确认对套接字的依赖性以及用于启动服务的命令。
[Service]
Type=notify
Sockets=syslog.socket
ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
问题是,如果我运行上述命令,它会正常启动并且按预期工作。
我的问题是:我运行程序启动命令和 systemd 启动同一程序有什么区别?我该怎么做才能找出它到底出了什么问题?
编辑1
我按照雷蒙德在答案中的建议启用了调试输出,并且输出并没有告诉我们更多信息。
May 08 10:31:29 server.corp systemd[1]: Starting System Logger Daemon...
May 08 10:31:29 server.corp systemd[1]: About to execute: /usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
May 08 10:31:29 server.corp systemd[1]: Forked /usr/sbin/syslog-ng as 3121
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service changed dead -> start
May 08 10:31:29 server.corp systemd[1]: Set up jobs progress timerfd.
May 08 10:31:29 server.corp systemd[1]: Set up idle_pipe watch.
May 08 10:31:29 server.corp systemd[3121]: Executing: /usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
May 08 10:31:29 server.corp systemd[1]: Got notification message for unit syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: Got message
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: got STATUS=Starting up... (Fri May 8 10:31:29 2015
May 08 10:31:29 server.corp systemd[1]: Got notification message for unit syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: Got message
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: got STATUS=Starting up... (Fri May 8 10:31:29 2015
May 08 10:31:29 server.corp systemd[1]: Received SIGCHLD from PID 3121 (syslog-ng).
May 08 10:31:29 server.corp systemd[1]: Child 3121 (syslog-ng) died (code=exited, status=2/INVALIDARGUMENT)
May 08 10:31:29 server.corp systemd[1]: Child 3121 belongs to syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service changed start -> failed
May 08 10:31:29 server.corp systemd[1]: Job syslog-ng.service/start finished, result=failed
May 08 10:31:29 server.corp systemd[1]: Failed to start System Logger Daemon.
在 syslog-ng 进程开始时会显示一些警告(不会阻止其正常启动),因此我将所有输出重定向到 /dev/null,但最终结果是相同的。
另外,顺便说一句,如果 systemd 无法记录系统日志,我的整个系统将不再启动。可以使用内核选项禁用此功能以登录 kmesg。
答案1
我们在 Debian 8.1 上遇到了同样的问题,但通过将 syslog-ng 本地配置更改为unix-dgram
使用unix-socket
.
我被线索了RedHat Bugzilla 上的此评论:
关于自定义 syslog-ng 配置文件的注意事项
由于 systemd 和 syslog-ng 旧配置文件之间的 unix 套接字类型不匹配,具有自定义 syslog-ng 配置的用户很可能会面临升级问题:
- systemd 创建 /dev/log 作为
unix-dgram
- syslog-ng < 3.2.5 预期 /dev/log 为
unix-stream
(配置文件)如果您在日志消息源之一中使用“unix-stream ("/dev/log")”,则需要手动将其更改为“unix-dgram ("/dev/log")”。
答案2
也许尝试添加:
Environment=SYSTEMD_LOG_LEVEL=debug
到你的服务单元文件然后看看转储出来什么?
我还想知道 systemd 是否试图通过运行来确保 syslog-ng 成功启动
systemctl status syslog-ng
并且因为您的单元文件中没有匹配的“状态”指令,所以它假设服务未正确启动并终止进程?
答案3
我遇到了完全相同的问题(Debian 8.4,syslog-ng v3.5.6)。
尝试在 syslog-ng 配置文件中注释或删除以下行:
unix-dgram("/dev/log");
从https://wiki.gentoo.org/wiki/Systemd#syslog-ng_source_for_systemd
答案4
如果发现使用 ip (0.0.0.0) 以外的任何内容都会导致崩溃。因此,指定一个已知的 IP 地址就是问题所在。
我使用 syslog-ng 3.5.6。