Postfix master.pid ExecStartPre 退出状态为 255

Postfix master.pid ExecStartPre 退出状态为 255

当我在 Rockylinux 服务器上重新启动 Postfix 守护程序时,发生了一个restorecon错误,无法避免服务的启动,但仍然出现错误:

 ● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-07-26 19:02:20 CEST; 30min ago
  Process: 2277 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 2300 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 2298 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 2295 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
  Process: 2292 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=255)
 Main PID: 2368 (master)
    Tasks: 3 (limit: 11346)
   Memory: 4.4M
   CGroup: /system.slice/postfix.service
           ├─2368 /usr/libexec/postfix/master -w
           ├─2369 pickup -l -t unix -u
           └─2370 qmgr -l -t unix -u

   systemd[1]: Starting Postfix Mail Transport Agent...
   restorecon[2292]: /usr/sbin/restorecon: lstat(/var/spool/postfix/pid/master.pid) failed: No such file or directory
   postfix/master[2368]: daemon started -- version 3.5.8, configuration /etc/postfix
   systemd[1]: Started Postfix Mail Transport Agent.

我不明白为什么他找不到 master.pid,即使他在这里/var/spool/postfix/pid/当服务启动时。

提前感谢提供的帮助

答案1

如果在后续步骤中启动 postfix 之前没有运行,则在调用此命令时,该文件可能尚不存在.ExecStartPre=用于指定 systemd 应调用的命令 ExecStart=,因此你对文件存在的验证该点测试的并不是同一件事。

询问该单元文件的分销商/维护者,在我看来这并非故意的。

答案2

这看起来像是 systemd 单元文件与 selinux 结合时的一个失误,因为如果 selinux 被禁用(完全禁用,而不仅仅是切换到宽容模式),错误就会消失。我最终通过在发出touch之前将添加到单元文件中来自己解决了这个问题restorecon

首先,我将 systemd 单元文件复制到/etc/systemd/system/应该放置自定义单元文件的位置:

cp /usr/lib/systemd/system/postfix.service /etc/systemd/system/

然后编辑/etc/systemd/system/postfix.service并添加一行包含

ExecStartPre=-/usr/bin/touch /var/spool/postfix/pid/master.pid

在包含 的行之前restorecon。所以我的单元文件如下所示:

[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
PrivateTmp=true
CapabilityBoundingSet=~ CAP_NET_ADMIN CAP_SYS_ADMIN CAP_SYS_BOOT 
CAP_SYS_MODULE
ProtectSystem=true
PrivateDevices=true
ExecStartPre=-/usr/bin/touch /var/spool/postfix/pid/master.pid
ExecStartPre=-/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop

[Install]
WantedBy=multi-user.target

之后发出 systemd 重新加载,systemctl daemon-reload以便它读取新的/修改后的 postfix 单元文件。

现在停止和启动/重新启动 postfix 不会再产生错误(postfix 进程实际上正在运行,只是restorecon退出代码不等于 0)。

答案3

这个问题已经通过删除“/master.pid“来自 /usr/lib/systemd/system/postfix.service 的文件名

改变:ExecStartPre = - / usr / sbin / restorecon -R / var / spool / postfix / pid/master.pid

到:ExecStartPre = - / usr / sbin / restorecon -R / var / spool / postfix / pid

来源:https://bugzilla.redhat.com/show_bug.cgi?id=2162659#c3

相关内容