postfix
重新启动系统后该服务将不会启动。我们正在使用基于 OpenSuse 12.1 的自定义 Linux 操作系统,最近验证部门发现/var
由于postfix
.
谁发送这些邮件?我们有一些应用程序在系统之间共享一些日志。
我正在寻找不同类型的论坛来寻找答案,但没有成功。
雷伯特之后:
$systemctl status postfix.service
postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/etc/systemd/system/postfix.service; enabled)
Active: inactive (dead)
CGroup: name=systemd:/system/postfix.service
我在这里找到了Postfix 不会在重新启动时启动该问题可能与 发生冲突sendmail
。为了确保该sendmail
程序与以下内容良好链接postfix
:
$ ldd /usr/sbin/sendmail
linux-vdso.so.1 => (0x00007fffa25ff000)
libpostfix-global.so.1 => /usr/lib64/libpostfix-global.so.1 (0x00007fdb174d2000)
libpostfix-util.so.1 => /usr/lib64/libpostfix-util.so.1 (0x00007fdb1729a000)
libc.so.6 => /lib64/libc.so.6 (0x00007fdb16f0a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fdb16d06000)
libdb-4.8.so => /usr/lib64/libdb-4.8.so (0x00007fdb1698a000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fdb16772000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdb1770b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdb16555000)
我也检查了一下/var/log/messages
,没有任何关于sendmail
甚至postfix
失败的信息。
让我们启动服务:
$ systemctl start postfix.service
$ systemctl status postfix.service
postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/etc/systemd/system/postfix.service; enabled)
Active: active (running) since Sat, 28 Jan 2017 21:49:37 +0300; 41s ago
Process: 3450 ExecStartPost=/etc/postfix/system/cond_slp register (code=exited, status=0/SUCCESS)
Process: 3444 ExecStartPost=/etc/postfix/system/wait_qmgr 60 (code=exited, status=0/SUCCESS)
Process: 3368 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 3366 ExecStartPre=/etc/postfix/system/update_chroot (code=exited, status=0/SUCCESS)
Process: 3363 ExecStartPre=/bin/echo Starting mail service (Postfix) (code=exited, status=0/SUCCESS)
Main PID: 3443 (master)
CGroup: name=systemd:/system/postfix.service
├ 3443 /usr/lib/postfix/master
├ 3445 pickup -l -t fifo -u
├ 3446 qmgr -l -t fifo -u
├ 3447 cleanup -z -t unix -u
├ 3466 trivial-rewrite -n rewrite -t unix -u
├ 3467 local -t unix
├ 3468 local -t unix
└ 3469 local -t unix
好的。重启系统,服务转为不活跃(死亡)。返回/var/log
我发现这个文件mail.warn
$ cat mail.info
Jan 28 03:13:55 msx postfix/postfix-script[2527]: warning: not owned by group maildrop: /usr/sbin/postqueue
Jan 28 03:13:55 msx postfix/postfix-script[2528]: warning: not owned by group maildrop: /usr/sbin/postdrop
Jan 28 03:13:55 msx postfix/postfix-script[2530]: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue
Jan 28 03:13:55 msx postfix/postfix-script[2531]: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop
Jan 28 21:49:37 msx postfix/postfix-script[3430]: warning: not owned by group maildrop: /usr/sbin/postqueue
Jan 28 21:49:37 msx postfix/postfix-script[3431]: warning: not owned by group maildrop: /usr/sbin/postdrop
Jan 28 21:49:37 msx postfix/postfix-script[3434]: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue
Jan 28 21:49:37 msx postfix/postfix-script[3435]: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop
不知道这是否能帮助解决我的问题。
额外信息
文件内postfix.service
:
$ cat /etc/systemd/system/postfix.service
[Unit]
Description=Postfix Mail Transport Agent
Requires=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target
After=var-run.mount nss-lookup.target network.target remote-fs.target syslog.target time-sync.target
After=amavis.service mysql.service cyrus.service ldap.service openslp.service ypbind.service
Before=mail-transfer-agent.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
ExecStartPre=-/bin/echo 'Starting mail service (Postfix)'
EnvironmentFile=-/etc/sysconfig/postfix
ExecStartPre=/etc/postfix/system/update_chroot
ExecStart=/usr/sbin/postfix start
ExecStartPost=/etc/postfix/system/wait_qmgr 60
ExecStartPost=/etc/postfix/system/cond_slp register
ExecReload=/usr/sbin/postfix reload
ExecReload=/usr/sbin/postfix flush
ExecStop=/usr/sbin/postfix stop
ExecStopPost=/etc/postfix/system/cond_slp deregister
[Install]
WantedBy=multi-user.target
重新启动后列出所有服务而不启动postfix
服务。
$systemctl list-unit-files --type=service
...
klog.service disabled
klogd.service masked
ldconfig.service masked
loadmodules.service masked
local.service static
localfs.service static
openhpid.service enabled
postfix.service enabled
postgresql.service static
poweroff.service static
proc.service masked
...
由于我们运行在基于 OpenSuse 12.1 的操作系统上,journalctl
因此尚未引入systemd
更新
LogLevel=debug
设置后/etc/systemd/system.conf
,我能够获得更多与此问题相关的数据。在/var/log/messages/
我发现这个:
Jan 31 19:17:00 msx kernel: 10.111126] systemd[1]: -.mount changed dead -> mounted
Jan 31 19:17:00 msx kernel: 10.111147] systemd[1]: Activating default unit: default.target
Jan 31 19:17:00 msx kernel: 10.111153] systemd[1]: Trying to enqueue job multi-user.target/start/replace
Jan 31 19:17:00 msx kernel: 10.111204] systemd[1]: Cannot add dependency job for unit hpiwdt.service, ignoring: Unit hpiwdt.service failed to load: No such file or directory. See system logs and 'systemctl status hpiwdt.service' for details.
Jan 31 19:17:00 msx kernel: 10.111276] systemd[1]: Found ordering cycle on lwresd.service/start
Jan 31 19:17:00 msx kernel: 10.111279] systemd[1]: Walked on cycle path to nss-lookup.target/start
Jan 31 19:17:00 msx kernel: 10.111281] systemd[1]: Walked on cycle path to lwresd.service/start
Jan 31 19:17:00 msx kernel: 10.111284] systemd[1]: Breaking ordering cycle by deleting job nss-lookup.target/start
Jan 31 19:17:00 msx kernel: 10.111286] systemd[1]: Deleting job postfix.service/start as dependency of job nss-lookup.target/start
我什至不知道什么是或者做 nss-lookup
。
答案1
nss-lookup.target
是可选的特殊目标之一systemd
。它本质上充当启动过程中的虚拟里程碑。具体来说,任何影响 DNS 查找的系统服务(lwresd
可能是这样)都应该在其.service
文件中指定它们需要启动前 nss-lookup.target
:
[Unit]
Wants=nss-lookup.target
Before=nss-lookup.target
...任何需要 DNS 解析才能启动的服务都可以简单地指定为:
[Unit]
After=nss-lookup.target
可能是lwresd
软件包没有完全遵循此方案,或者您的自定义发行版具有较旧的版本,systemd
其中有某种原因需要使用Requires=
而不是Wants=
当前推荐的方式。
当 systemd 在其配置中检测到排序冲突(“排序周期”)时,它会以非常机械的方式解决它,这在总体方案中并不总是最佳的。在本例中,问题在于lwresd
和之间的排序nss-lookup.target
,但 Postfix 在该过程中被跳过作为附带损害。
由于nss-lookup.target
是可选的,因此将其设置为Requires=
Postfix 的依赖项太强并且可能会导致问题......与您所遇到的完全一样。
答案2
首先,添加LogLevel=debug
提供/etc/systemd/system.conf
有用的日志来了解服务在启动运行时实际发生的情况。正如我更新的问题中提到的,存在与 的订单冲突nss-lookup.target
。通过nss-lookup.target
直接删除/etc/systemd/system/postfix.service
两个变量[Requires]
,[After]
系统就能够postfix
在启动过程中启动。