如何使用systemd调整启动顺序

如何使用systemd调整启动顺序

一旦 wifi 收到 IP 地址(基于 dhcpcd),我需要使用 postfix 作为服务器发送电子邮件。看来systemd默认情况下,在 wifi (wlan0) 准备好之前启动 postfix。与此相关的后果是 postfix 无法在后台运行,并且无法成功发送电子邮件。但是,如果我运行以下脚本(即abc.sh)启动时,电子邮件绝对可以通过:

sleep 60
systemctl restart postfix
echo 'email content' | mail -s 'titile' [email protected] 

关联的服务文件abc.sh如下:

[Unit]
Description=pptp_setup
Requires=network-online.target
After=network-online.target

[Service]
Type=forking
ExecStart=/home/pi/script/abc.sh

[Install]
WantedBy=multi-user.target 

注意睡眠 60systemctl 重新启动 postfix是确保电子邮件发送的技巧。要是睡眠 60在不重新启动 postfix 的情况下应用,电子邮件仍然无法发送,因为 postfix 最初未正确启动(如上所述,它可能会在接收 IP 之前加载)。另外如果只重启postfix而不睡眠60秒,postfix重启仍然会失败,即使 需要=网络在线.targetAfter=网络在线.target已应用到服务文件中。

我的问题是如何正确设置 postfix,以便在 wifi 收到 IP 地址后启动它。

答案1

这是一个常绿问题systemd,正如许多人多次讨论的那样地方。通过“慢速网络”激活,您最好的机会可能是IP_FREEBIND。您不能仅针对后缀修改它,而是使用以下命令在系统范围内修改它:

echo "1" > /proc/sys/net/ipv4/ip_nonlocal_bind

在 root 帐户下。它在手册页中有很好的描述ip(7)

答案2

当我将 Ubuntu 16.10 部署到新的 MiniPC 时,我遇到了同样的问题(与运行良好的 Ubuntu 14.x 相反)。

我终于找到了一个自动化解决方案:启用 NetworkManager-wait-online.service 并部署一个自定义脚本,该脚本在机器启动后 +-5 分钟重新启动 postfix 服务(假设此时无线连接处于活动状态)。

A. 启用此功能。这是一种通用方法,可能对 Postfix 之外的其他服务也有好处,因此我将其保留在脚本中。 systemctl enable NetworkManager-wait-online.service; systemctl status NetworkManager-wait-online.service;

B. 添加客户 Systemd 计时器 + 服务 @info 计时器将在机器启动后 {x} 分钟启动一次。 nano /etc/systemd/system/mjd-restart-postfix-after-wlan-connected.timer [Unit] Description=(timer)mjd-restart-postfix-after-wlan-connected [Timer] OnBootSec=5min [Install] WantedBy=timers.target nano /etc/systemd/system/mjd-restart-postfix-after-wlan-connected.service [Unit] Description=mjd-restart-postfix-after-wlan-connected [Service] Type=oneshot ExecStart=/bin/sh -ec "systemctl restart postfix; systemctl status postfix; uname -a | /usr/bin/mailx -s \"Server (`hostname`): postfix was restarted.\" [email protected]"

MYUNIT=mjd-restart-postfix-after-wlan-connected MYTIMER=${MYUNIT}.timer systemctl enable ${MYTIMER}; systemctl status ${MYTIMER}; systemctl list-units --all | grep "${MYUNIT}" systemctl status ${MYUNIT}

C. 重新启动 reboot #等待5分钟

D、检查 MYUNIT=mjd-restart-postfix-after-wlan-connected MYTIMER=${MYUNIT}.timer systemctl status ${MYTIMER}

如果这 2 个配置文件(Resolve 之一和 Postfix 之一)的内容不相同,则问题是有问题的(Postfix 在 LAN/WLAN 连接之前启动)。猫 /etc/resolv.conf 猫 /var/spool/postfix/etc/resolv.conf

E.信息@dochttps://bugs.launchpad.net/ubuntu/+source/postfix/+bug/1519331 @dochttps://wiki.archlinux.org/index.php/Systemd/Timers @doc qshape 延迟 @doc cat /var/log/syslog | egrep“网络管理器|后缀”

相关内容