我将 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.