我有一个/etc/init.d/脚本,它在启动时启动,需要联网才能到位。我把rc start设置为99,所以这是加载的最后一件事,但网络没有立即加载,我现在不得不依赖30秒的睡眠命令来等待网络加载。
操作系统是针对嵌入式系统(Yocto Project)修改的Ubuntu。文件系统是相同的,但服务非常有限,所以它使用的是Sysvinit。
有没有办法检查所有网络是否已完成加载?
如果有帮助,这是脚本:
#!/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
答案 0 :(得分:14)
基本的Debian方式:
基本上/etc/network/if-up.d
是这些脚本的地方。当接口在Debian系统或衍生系统上运行时,就会调用这些脚本 - 比如Ubuntu。在这里,您可以找到传递给这些脚本的环境变量列表。使用这些变量,您可以决定哪个接口启动以及接口配置的详细信息。在查看/etc/network/if-up.d
示例脚本可能看起来像这样(从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
并传递IFACE
,LOGICAL
,ADDRFAM
和METHOD
作为参数。您可以在服务的upstart脚本中使用此挂钩(如提到的@Guy):
start on net-device-up IFACE=eth0
答案 1 :(得分:3)
如果您使用的是Ubuntu,因为此问题已被标记,请考虑使用Ubuntu upstart
除了非常简单之外,您还可以:
start on net-device-up IFACE=eth0
了解更多信息,请参阅整个upstart cookbook