syslog-ng 服务未随 systemd 启动,但命令工作正常

syslog-ng 服务未随 systemd 启动,但命令工作正常

我在 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。

相关内容