编辑:对于遇到此问题的其他人来说,这个问题实际上被提出/理解得非常糟糕,可以找到问题的更好描述(以及正确的解决方案)这里。
我正在尝试在我的 Raspberry Pi 上设置邮件。我有设置和配置 Postfix一切都正常,除了在启动时脚本似乎在文件实际更新之前将其/etc/init.d/postfix
复制到其 chroot。/etc/resolv.conf
这会导致电子邮件发送因 DNS 问题而失败。
这个有更好的写法在这篇博文中以及解决方法(在启动脚本中注入“sleep 5”)。
我很好奇这种情况是如何/为什么发生的(以及为什么它可能只影响 Pi,或者影响的人很少,以至于没有被注意到/修复)以及错误实际上在哪里(所以我可以提出它 - 这是一个postfix 问题,或者 Pi 上的某些内容未按预期运行?)。
该/etc/init.d/postfix
文件的顶部有这个(说它依赖于网络;不确定这是否意味着它不应该在完成resolveconf之前启动?)
# Provides: postfix mail-transport-agent
# Required-Start: $local_fs $remote_fs $syslog $named $network $time
# Required-Stop: $local_fs $remote_fs $syslog $named $network
# Should-Start: postgresql mysql clamav-daemon postgrey spamassassin saslauthd dovecot
# Should-Stop: postgresql mysql clamav-daemon postgrey spamassassin saslauthd dovecot
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Postfix Mail Transport Agent
# Description: postfix is a Mail Transport agent
确保这种情况不会发生的预期机制是什么?
答案1
问题的发生是因为优先顺序。 postfix 启动似乎比 dhcpcd5 更早完成工作。
/etc/resolv.conf
一种可能的解决方案是在 DHCP 客户端完成工作后修复后缀监狱中的问题。我建议使用dhclient
并放置一个脚本来修复/etc/resolv.conf
目录中的问题/etc/dhcp/dhclient-exit-hooks.d
。
执行放置在该目录下的脚本后IP 是通过获取的dhcp
,这些脚本对于在获取和/或更改 IP 地址后采取所需的措施非常有用。
我实际上有一个关于这里主题的问题:处理 ISP 更改 IP 地址的更好方法?
Debian系统中的相关软件包是isc-dhcp-client
,如果没有安装,可以通过以下方式安装:
sudo apt-get install isc-dhcp-client
现在 /etc/network/interfaces
必须修改才能使用它:
auto eth0
iface eth0
最后:
sudo dpkg --purge dhcpcd5
实际上,卸载后dhcpcd5
(并与@Danny一起配置/etc/network/interfaces),优先级被强制执行,并且后缀问题得到解决。
不过,对于直接连接到 ISP 并永久开启的计算机,也建议使用 dhclient-exit-hooks.d 中的脚本,因为 ISP 可能会导致您的 IP 地址发生更改。
答案2
在 Ubuntu Zesty 上,以下内容将起作用:
升级到 postfix 后可能需要完成此修复。 Postscript 在重新启动后失败,因为它不等待网络恢复。这会导致它丢失 /etc/resolv.conf 中的条目 应该将这些条目复制到 /var/spool/postfix/etc/resolv.conf
更改和/或将以下内容添加到这些 systemd 文件的 [Unit] 块中:
/lib/systemd/system/[email protected]
/lib/systemd/system/postfix.service
添加或更改:
After=network-online.target
更改服务后重新加载 systemctl:
systemctl daemon-reload
reboot
注意:真正重要的文件是[电子邮件受保护]
答案3
使用 jessie 8.0 将脚本放入我的树莓派上的 /etc/dhcp/dhclient-exit-hooks.d/ 中没有执行任何操作。即使使其可执行也无济于事。看来这些脚本没有运行。
对我来说,这个问题是 systemd、网络管理器和 resolvconf 带来的复杂性的另一个糟糕例子。
向 /etc/rc.local 添加一行也不起作用。
我发现在我的系统上 /etc/rc.local 运行了 18 秒!在 /etc/resolv.conf 更新之前。
由于树莓派位于本地 LAN 上,我通过使 /etc/resolv.conf 不可变来禁用 resolvconf 机制,但即使这样也没有帮助。
/var/spool/postfix/etc/resolv.conf 现在具有正确的条目,但 postfix 仍然无法正常运行,条目挂在 mqueue 中,显示“(未找到主机或域名。name=.... 的名称服务错误” com type=MX: 未找到主机,请重试)”
我尝试在 /etc/rc.local 中使用以下行延迟 30 秒批量重新启动 postfix,( sleep 30 ; service postfix restart ) &
但这也不起作用。
但是如果我登录系统并手动重新启动 postfix 邮件就会被发送。所以我更改了 最终为我解决问题的
条目。
( sleep 30 ; /etc/init/postfix stop ; sleep 5 ; /etc/init/postfix start ) &