10r*_*nho 26 debian systemd systemd-networkd
我正在尝试在 Debian Jessie 上创建一个 systemd 服务。我需要它在network-online.target到达后开始。
问题是同时network-online.target触发network.target,当时我的接口尚未配置,刚刚启动 DHCP 查询。
看起来这个问题是 Debian 特有的,因为它使用旧网络配置。
如何绕过这个问题或如何network-online.target工作?
sai*_*895 18
由于您正在使用/etc/network/interfaces,您将需要一个 systemd 服务来监视每个接口的状态。检查您是否已/lib/systemd/system/ifup-wait-all-auto.service安装(由ifupdownUbuntu 15.04 中的软件包安装)。如果没有,则创建/etc/systemd/system/ifup-wait-all-auto.service并粘贴以下内容:
[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
[ -n "$INTERFACES" ] || exit 0; \
while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'
[Install]
WantedBy=network-online.target
Run Code Online (Sandbox Code Playgroud)
这是存在于 Ubuntu 15.04 系统上的服务文件,但[Install]添加了该部分以使事情变得更容易。我希望ifupUbuntu 15.04 中的行为与ifupDebian Jessie 中的行为相同。如果没有,则需要进行一些修改(尤其是最后一行)。
然后,运行sudo systemctl enable ifup-wait-all-auto.service。重新启动计算机后,您应该看到network-online.target在接口启动后到达(至少)。
小智 6
我曾经在 Github 上找到了一个答案,通过不断尝试 ping 服务器来解决这个问题。只有当 ping 通时,服务才会继续:
[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>
Run Code Online (Sandbox Code Playgroud)
我替换google.com为我自己的服务器,因为我的主脚本需要连接到我的服务器。
| 归档时间: |
|
| 查看次数: |
25541 次 |
| 最近记录: |