You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在网络连接建立后执行sysvinit环境下的initscript脚本?

在SysVinit环境下实现网络就绪后执行Initscript

针对Yocto构建的无systemd系统,有三种可靠方法让你的initscript在网络连接完成后执行:

方法一:在脚本启动函数中添加网络连通性检测

直接在start()函数里加入等待网络就绪的逻辑,确保curl调用前网络可用。可以通过检测网卡IP、ping网关或公共地址实现:

修改后的脚本示例:

#!/bin/bash
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

# 等待网络就绪的检测函数
wait_for_network() {
    # 检测网卡是否获取到IP(替换为你的实际网卡名,如wlan0)
    while ! ip addr show eth0 | grep -q "inet "; do
        echo "Waiting for eth0 to get IP address..."
        sleep 2
    done

    # 验证网络连通性(可替换为内网网关地址减少对外依赖)
    local timeout=30
    local count=0
    while ! ping -c 1 -W 2 8.8.8.8 > /dev/null 2>&1; do
        count=$((count+1))
        if [ $count -ge $timeout ]; then
            echo "Network connection timeout after $timeout seconds"
            exit 1
        fi
        echo "Waiting for network connectivity... ($count/$timeout)"
        sleep 1
    done
}

start() {
    # 先等待网络就绪
    wait_for_network
    
    # 执行原有启动逻辑
    echo "Starting application..."
    # 你的curl调用
    curl https://example.com/api
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name

}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    *)
       echo "Usage: $0 {start|stop|restart}"
esac

exit 0

方法二:调整SysVinit启动链接的执行顺序

SysVinit通过/etc/rc.d/rc*.d/目录下的符号链接前缀Sxx的数字控制启动顺序,确保你的脚本在网络服务之后启动:

  1. 找到系统的网络启动脚本(通常是/etc/init.d/network或/etc/init.d/networking),查看它的启动序号(比如S40network)。
  2. 给你的脚本设置更大的启动序号(比如S50yourapp),保证晚于网络服务启动。
  3. 在Yocto中,可通过配方的.bbappend文件配置:
    INITSCRIPT_PARAMS = "start 50 2 3 4 5 . stop 01 0 1 6 ."
    
    这里start 50表示在运行级别2-5中以序号50启动,stop 01表示关机/重启时优先停止。

方法三:利用网络启动钩子脚本

部分SysVinit系统会在网卡启动成功后触发/etc/network/if-up.d/目录下的脚本,可借助这个机制启动你的应用:

  1. 创建钩子脚本/etc/network/if-up.d/start-yourapp:
    #!/bin/bash
    # 仅在目标网卡(如eth0)启动时执行
    if [ "$IFACE" = "eth0" ]; then
        # 启动你的应用脚本
        /etc/init.d/yourapp start
    fi
    
  2. 给脚本添加执行权限:chmod +x /etc/network/if-up.d/start-yourapp
  3. 在Yocto配方的.bbappend中添加安装逻辑:
    FILES_${PN} += "/etc/network/if-up.d/start-yourapp"
    SRC_URI += "file://start-yourapp"
    
    将start-yourapp脚本放在配方的files目录下即可。

额外说明

  • 如果系统使用connman或NetworkManager管理网络,需调整检测逻辑(比如检测connman的在线状态)。
  • 所有方法可根据实际网络环境灵活调整,比如替换ping目标为内网地址、修改网卡名称等。

内容的提问来源于stack exchange,提问作者Preeti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:45:29