bash – 如何检测在/etc/init.d脚本中初始化网络的时间?
我有一个/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 解决方法
基本的Debian方式:
基本上/etc/network/if-up.d是这些脚本的地方.当接口在Debian系统或衍生系统上运行时,就会调用这些脚本 – 比如Ubuntu.在这里,您可以找到传递给这些脚本的环境变量列表.使用这些变量,您可以决定哪个接口启动以及接口配置的详细信息.在查看/etc/network/if-up.d时,您可以找到此类scipts的示例 示例脚本可能看起来像这样(从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挂钩将触发事件net-device-up并传递IFACE,LOGICAL,ADDRFAM和METHOD作为参数.您可以在服务的upstart脚本中使用此挂钩(如提到的@Guy): start on net-device-up IFACE=eth0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |