Postfix

Postfix 在使用 systemctl 啟用其服務並且不會在啟動時啟動時會導致問題

  • March 7, 2022

Rocky Linux 8.5 版機器(下游兼容 bug-for-bug 的 Red Hat Enterprise Linux)上,我配置了 Postfix + Dovecot 設置。在對所有配置錯誤進行故障排除後,我到了至少可以啟動這兩個服務的地步。

systemctl enable dovecot.service
systemctl enable postfix.service

重啟機器後,我可以看到 Dovecot 在使用systemctl status dovecot. 另一方面,Postfix 無法啟動,報告:

[root@mail ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
  Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
  Active: failed (Result: exit-code) since ...; 12min ago
 Process: 1419 ExecStart=/usr/sbin/postfix start (code=exited, status=1/FAILURE)
 Process: 1396 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
 Process: 1364 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)

systemd[1]: Starting Postfix Mail Transport Agent...
postfix/postfix-script[1506]: fatal: the Postfix mail system is already running
systemd[1]: postfix.service: Control process exited, code=exited status=1
systemd[1]: postfix.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Postfix Mail Transport Agent.

使用快速檢查postfix status表明它確實沒有執行。但令人驚訝的是,postfix start然後啟動服務沒有任何問題。查詢postfix status然後報告 Postfix 正在使用新的 PID 愉快地執行。之後再查詢systemctl status postfix一次,顯示與之前相同的錯誤報告。

但是,報告的錯誤沒有意義。我可以systemctl disable postfix,重新啟動機器,檢查 Postfix 是否真的沒有同時使用,systemctl status postfix然後postfix status嘗試啟用它systemctl start postfix並得到相同的錯誤。

此外,如果我在 systemd 中禁用 Postfix 服務,重新啟動機器並僅使用 啟動它postfix start,該服務將啟動,但systemctl status postfix報告它已載入、不活動…

[root@mail ~]# postfix start
postfix/postfix-script: starting the Postfix mail system
[root@mail ~]# postfix status
postfix/postfix-script: the Postfix mail system is running: PID: 2169
[root@mail ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
  Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor preset: disabled)
  Active: inactive (dead)
[root@mail ~]#

為什麼 RHEL 上的 Postfix 在它斷然拒絕這樣工作時甚至註冊為服務?那麼確保 Postfix 在引導時啟動的正確方法是什麼?

**注意:**我試過chkconfig postfix on了,因為我發現網上有人建議。這只是轉發了systemctl enable postfix.service讓我回到開始的請求。

…我真的必須破解它 using /etc/rc.local,當文件本身的內容說它只是為了兼容性目的而存在時,不應該再使用並且我應該考慮使用 systemd 服務?

**更新 1:**我暫時採用了一種看似合理的解決方法 -postfix start使用/etc/rc.local. 重新啟動後,Postfix 仍然沒有執行。使用查看rc-local服務的狀態,systemctl status rc-local服務啟動失敗,日誌中的原因和我開啟後postfix服務日誌中的原因一模一樣systemctl——“fatal:postfix郵件系統已經跑步”。Postfix 在所有情況下都無法在啟動時啟動。

這聽起來像是 SysV 和 systemd 衝突。嘗試在 systemd 中禁用該服務並重新啟動並查看它是否執行。它可能會執行。

sudo systemctl disable posfix
sudo init 6

請注意,我使用init 6它是因為這是最原始的重啟方式。rebootshutdown函式會做一些額外的事情,這些事情可能會導致副作用。最新的方法實際上是systemctl reboot,但我還沒有使用它。

這應該不會給您任何錯誤,並且它很可能正在執行。

如果使用 SysV,那麼您應該在/etc/rc?.d(其中?是從 1 到 6 的數字)下看到引用後綴的連結。

此外,可能是 postfix 通過檢查 PID 文件而不是具有該 PID 的程序是否確實在執行來檢測它已經在執行。那將是我的下一次嘗試。當程序無法啟動時,我經常在啟動前進行徹底停止,以便此類清理有機會重置:

systemctl stop postfix
systemctl start postfix

引用自:https://serverfault.com/questions/1095337