以下是 的内容/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
命令与eth0
only 相关联。另外,将脚本移出if-up.d
文件夹。该文件夹中的脚本会自动执行,无论是否定义为post-up
.在您的情况下,它将额外运行您的post-up
- 命令。