在/etc/init.d脚本中如何检测networking初始化?

我有一个启动时启动的/etc/init.d/脚本,需要联网。 我已经将rc start设置为99,所以这是加载的最后一件事情,但是networking不能立即加载,我目前不得不依靠30秒的睡眠命令来等待networking加载。

操作系统是Ubuntu修改的embedded式系统(Yocto项目)。 文件系统是一样的,但服务非常有限,所以它使用Sysvinit。

有没有办法检查所有的networking已经完成加载?

这是脚本,如果它是帮助:

#!/bin/sh # # Daemon Name: blerd # # chkconfig: - 3 99 1 # description: M3 Bluetooth Low Energy Relay Daemon # Source function library. . /etc/init.d/functions PROGRAM=bler LOCKFILE=/var/lock/subsys/$PROGRAM start() { [ -x $EXE ] || exit 5 echo -n "Starting $PROGRAM: "; if [ -e $LOCKFILE ]; then echo "Instance of $PROGRAM exists." return 0; fi sleep 30 $PROGRAM RETVAL=$? if [ $RETVAL -eq 0 ]; then echo "Success" else echo "Failed" fi [ $RETVAL -eq 0 ] && touch $LOCKFILE return $RETVAL } stop() { echo -n "Stopping $PROGRAM: " if [ ! -e $LOCKFILE ]; then echo "No instance of $PROGRAM exists." return 0; fi killproc $PROGRAM RETVAL=$? if [ $RETVAL -eq 0 ]; then echo "Success" else echo "Failed" fi [ $RETVAL -eq 0 ] && rm -f $LOCKFILE return $RETVAL } status() { echo -n "Status $PROGRAM: " if [ -e $LOCKFILE ]; then echo "Running" else echo "Stopped" fi return 0; } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 2 ;; esac 

基本的Debian方式

基本上/etc/network/if-up.d是这样的脚本的地方。 当一个接口在Debian系统或派生类似的Ubuntu上调用这些脚本。 在这里您可以找到传递给这些脚本的环境变量列表。 使用这些变量,您可以决定哪个接口正在启动,以及接口配置的详细信息。 在查看/etc/network/if-up.d时可以找到这样的scipt的例子

一个示例脚本可能看起来像这样(从samba包派生出来,只是为了解释工作原理,如果你使用Ubuntu,你应该使用upstart稍后会解释)

/etc/network/if-up.d/your-service

 #!/bin/sh # Try to bring nmbd up when an interface comes up, if smbd is already running. # Don't bother to do anything for lo. if [ "$IFACE" = lo ]; then exit 0 fi # Only run from ifup. if [ "$MODE" != start ]; then exit 0 fi # we only care about inet and inet6. case $ADDRFAM in inet|inet6|NetworkManager) ;; *) exit 0 ;; esac # start the service invoke-rc.d your-service start >/dev/null exit 0 

请注意 ,你需要

 chmod +x /etc/network/if-up.d/your-service 

Ubuntu / Upstart

Ubuntu正在使用upstart作为sysvinit替代品。 如果你正在研究/etc/network/if-up.d/你会发现这个upstart已经在那里放了一个钩子。 这个钩子是更详细的upstart机制的基础,它提供了启动服务的可能性,除非某个网络接口已经被提出。 upstart钩子将触发事件net-device-up并通过IFACELOGICALADDRFAMMETHOD作为参数。 你在服务的贵族脚本中使用这个钩子(就像@Guy提到的):

 start on net-device-up IFACE=eth0 

如果你在Ubuntu上,这个问题被标记,请考虑使用Ubuntu新贵

除了非常简单之外,您还可以:

 start on net-device-up IFACE=eth0 

欲了解更多信息,请参阅整个新贵食谱