为什么 postgrey 无法在 Ubuntu 16.04 启动时正确启动?

为什么 postgrey 无法在 Ubuntu 16.04 启动时正确启动?

我将 Ubuntu 14.04 LTS 升级到 16.04.1 LTS,现在我的 postgrey 安装出现了问题。当我(重新)启动服务器时,postgrey 启动脚本似乎被调用,但 postgrey 无法正确启动。只有手动重新启动服务后,postgrey 才能正常工作。

更详细地说:重新启动后,我的系统日志中出现以下几行:

Dec  1 19:22:14 systemd[1]: Starting LSB: Start/stop the postgrey daemon...
Dec  1 19:22:14 postgrey[998]:  * Starting postfix greylisting daemon postgrey
Dec  1 19:22:15 postgrey[1050]: Process Backgrounded
Dec  1 19:22:15 postgrey[1050]: 2016/12/01-19:22:15 postgrey (type Net::Server::Multiplex) starting! pid(1050)
Dec  1 19:22:15 postgrey[998]:    ...done.
Dec  1 19:22:15 systemd[1]: Started LSB: Start/stop the postgrey daemon.

然后当我ps输入 postgrey 时,没有找到任何进程。但是,一个简单的sudo systemctl restart postgrey命令就可以让它正常运行。启动记录在 syslog 中,如下所示:

Dec  1 19:25:54 systemd[1]: Stopping LSB: Start/stop the postgrey daemon...
Dec  1 19:25:54 postgrey[1878]:  * Stopping postfix greylisting daemon postgrey
Dec  1 19:25:54 systemd[1]: postgrey.service: Control process exited, code=exited status=1
Dec  1 19:25:54 systemd[1]: Stopped LSB: Start/stop the postgrey daemon.
Dec  1 19:25:54 systemd[1]: postgrey.service: Unit entered failed state.
Dec  1 19:25:54 systemd[1]: postgrey.service: Failed with result 'exit-code'.
Dec  1 19:25:54 systemd[1]: Starting LSB: Start/stop the postgrey daemon...
Dec  1 19:25:54 postgrey[1886]:  * Starting postfix greylisting daemon postgrey
Dec  1 19:25:54 postgrey[1886]: Pid_file "/var/run/postgrey.pid" already exists.  Overwriting!
Dec  1 19:25:54 postgrey[1893]: Process Backgrounded
Dec  1 19:25:54 postgrey[1893]: 2016/12/01-19:25:54 postgrey (type Net::Server::Multiplex) starting! pid(1893)
Dec  1 19:25:54 postgrey[1886]:    ...done.
Dec  1 19:25:54 systemd[1]: Started LSB: Start/stop the postgrey daemon.
Dec  1 19:25:54 postgrey[1893]: Resolved [localhost]:10023 to [::1]:10023, IPv6
Dec  1 19:25:54 postgrey[1893]: Resolved [localhost]:10023 to [127.0.0.1]:10023, IPv4
Dec  1 19:25:55 postgrey[1893]: Binding to TCP port 10023 on host ::1 with IPv6
Dec  1 19:25:55 postgrey[1893]: Binding to TCP port 10023 on host 127.0.0.1 with IPv4
Dec  1 19:25:55 postgrey[1893]: Setting gid to "120 120"
Dec  1 19:25:55 postgrey[1893]: Setting uid to "112"

如您所见,这次 postgrey 记录了它与正确端口的绑定。当我ps现在查看输出时,我可以看到其中的工作进程。我的问题是:为什么在启动时调用该进程时无法正确启动?我如何才能查明错误?我找不到任何导致错误的原因,因此任何有关该问题的建议也可能对我有帮助。由于它曾经在 14.04 中工作,但在 16.04 中停止工作,也许它与 upstart 和 systemd 有关?

答案1

postgrey项目不包含在 systemd“服务单元”文件中,Ubuntu 软件包也不包含。该服务由一个 shim 加载,该 shim 允许 systemd 管理使用较旧的 sysv“init”脚本的服务。这应该可以工作,但增加了额外的间接层和复杂性。我建议您尝试将以下内容放入/etc/systemd/system/postgrey.service

[Unit]
Description=Postfix Greylisting Service
Before=postfix.service

[Service]
Type=forking
ExecStartPre=-/bin/rm -f /var/run/postgrey.pid
PIDFile=/var/run/postgrey.pid
ExecStart=/usr/local/sbin/postgrey --inet=10025 -d --delay=150 --pidfile=/var/run/postgrey.pid
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

然后禁用 sysv init 版本的运行:

update-rc.d -f postgrey remove

您需要启用新的 systemd 服务以在启动时启动:

 systemctl enable postgrey

现在再次尝试使用 systemd 启动服务:

 systemctl start postgrey

如果它仍然启动失败。请检查此服务的具体日志journalctl -u postgrey以及常规 systemd 日志:journalctl

我还建议向postgrey项目提交一个补丁,将 systemctl 单元文件添加到他们的contrib目录中,这样将来就可以使用官方的 systemd 服务文件在基于 systemd 的系统上启动服务,而不需要垫片层。

答案2

我在禁用 IPV6 的 Ubuntu 16 系统上遇到了非常类似的问题,它与 postgrey 在端口 10025 上的 IPV6 绑定失败有关。

我通过编辑修复了它/etc/default/postgrey并将--inet参数更改为:

--inet=127.0.0.1:10025

当然,更好的解决方案是让 systemd 按照第一个答案中描述的方式处理它,并将行--inet中的参数设置ExecStart=127.0.0.1:10025

日志中没有任何痕迹,直到我在控制台中运行 postgres 二进制文件并看到以下内容:

ERROR: Can't connect to TCP port 10025 on ::1 [Cannot assign requested address] at /usr/sbin/postgrey line 776.

相关内容