为什么 /etc/network/interfaces 中的 post-up 命令在启动时运行多次?

为什么 /etc/network/interfaces 中的 post-up 命令在启动时运行多次?

以下是 的内容/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

sshstart一个包含以下内容的脚本:

curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 [email protected] -p 8080

当机器重新启动时,该curl命令会被执行多次,文件在 ftp 服务器上结束 2 或 3 次,当我查看进程时,似乎有多个 autossh 实例正在运行...不确定这是否是这样autossh 是否执行操作,但可以肯定的是,curl 不应该多次上传文件。

我的预感是整个sshstart脚本运行了多次,但我不明白为什么。

我尝试在启动时搜索有关网络设置过程的详细信息,但我所能找到的只是接口文件的语法信息。

有人可以帮忙吗?

谢谢。

- -编辑 - -

如下所示,我已按如下方式修改了接口文件(删除了帖子上方的空行):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

并将以下行添加到 sshstart:

echo $(date)>>/run/shm/sshstart.log

/run/shm/sshstart.log以下是重启后的内容:

Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014

所以它已经运行了 4 次:( 发生了什么?

答案1

文件位于/etc/network/if-up.d 已经每当接口(任何接口)出现时自动运行。当您在显式命令中指定要再次运行相同的脚本时post-up,只会导致该脚本再次运行。所以我的猜测应该是这样:

  • 由于lo位于.IFACE=lo/etc/network/if-up.d
  • 出于同样的原因,它在eth0出现时(使用环境变量)运行一次。IFACE=eth0
  • eth0它在出现时再次运行(环境变量IFACE未设置),因为您在指令中要求这样做post-up

我不知道第四次是从哪里来的,但无论如何已经是第三次了。

您需要将脚本定位到其他位置并使用post-up指令运行一次,或者将其保留在原处但不在指令中提及它post-up并检查 的值,$IFACE以便除非所需的接口 ( eth0) 出现,否则它不会执行任何操作向上。

答案2

正如 Celada 所说,/etc/network/if-up.d脚本是为每个接口运行的。为了避免规则重复,只需添加:

[ "$IFACE" = "eth0" ] || exit 0

在脚本的顶部。如果界面不是所需的界面,这将导致脚本立即退出。

答案3

中的脚本/etc/network/if-*.d针对每个接口运行,但是也适用于每个地址族(IPv4 和 IPv6)。

$ADDRFAM如果您不想或不需要脚本同时针对 IPv4 和 IPv6 系列运行,则可以检查该变量。

例如,如果您只需要为特定接口运行脚本并且仅针对其 IPv4 地址,则可以从以下内容开始:

[ "$IFACE"   = "eth0" ] || exit 0  # we only want interface "eth0"
[ "$ADDRFAM" = "inet" ] || exit 0  # we only want IPv4 (not "inet6" for IPv6)

答案4

删除-命令之前的空行post-up。这应该将post-up命令与eth0only 相关联。另外,将脚本移出if-up.d文件夹。该文件夹中的脚本会自动执行,无论是否定义为post-up.在您的情况下,它将额外运行您的post-up- 命令。

相关内容