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


10

这是内容/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 username@17.16.15.2 -p 8080

当机器重启时,该curl命令执行了多次,该文件在ftp服务器上结束了2到3次,当我查看进程时,似乎有多个autossh实例正在运行...不确定这是怎么回事autossh可以执行任何操作,但可以肯定curl不应该多次上传文件。

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

我尝试在引导时搜索有关网络设置过程的详细信息,但我只能找到interfaces文件的语法信息。

有人可以帮忙吗?

谢谢。

---编辑---

按照下面的建议,我已经按照如下方式修改了我的接口文件(删除了张贴后的空白行):

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
提示:lo将if-up.d设置为true,eth0还将其设置为true。每次设置后,都会进行发布。您的脚本仅需依赖于1个启用的接口,而不必同时依赖于两者。
eyoung100,2014年

我以为可能是这样,请多花点时间尝试RTFM。
TCZ8 2014年

我已经检查了一下,但是我找不到如何为post-up命令指定哪个适配器,似乎与“节”有关,但是我不完全了解。Debian和Ubuntu界面页面上有很多信息,但是他们跳过了这一部分。
TCZ8 2014年

1
与问题无关,但BTW echo $(date)有点笨拙和间接。最好将其拼写为date。类似于猫的无用使用奖
Celada

哈哈哈!你是绝对正确的!我不知道为什么要这么做:P
TCZ8

Answers:


13

只要出现接口(任何接口),文件中的文件/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)到来,否则它什么也不做起来。


天哪!最后!您绝对正确,我刚刚在sshstart中添加了一行,以在日志文件中回显$ IFACE,其内容与您所描述的完全相同!第一次是lo,第二次是eth0,第三次是eth0(形成后期),第四次则不清楚。.$ IFACE在第四次的值是:--all您不会碰巧知道那是什么手段?只是出于好奇:)
TCZ8 2014年

1
我不知道--all。听起来好像有一项功能可以if-up.d使用该参数最后一次运行脚本,以表明所有接口现在都已启动,以防万一某个脚本在得知没有其他接口挂起后想采取措施。那是第四次解释了。
Celada

这很有意义,感谢您的所有帮助!
TCZ8

3

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

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

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


1

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


无法运作,请参阅我的问题中的编辑。
TCZ8 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.