如何在网络连接建立后执行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的数字控制启动顺序,确保你的脚本在网络服务之后启动:
- 找到系统的网络启动脚本(通常是
/etc/init.d/network或/etc/init.d/networking),查看它的启动序号(比如S40network)。 - 给你的脚本设置更大的启动序号(比如
S50yourapp),保证晚于网络服务启动。 - 在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/目录下的脚本,可借助这个机制启动你的应用:
- 创建钩子脚本
/etc/network/if-up.d/start-yourapp:#!/bin/bash # 仅在目标网卡(如eth0)启动时执行 if [ "$IFACE" = "eth0" ]; then # 启动你的应用脚本 /etc/init.d/yourapp start fi - 给脚本添加执行权限:
chmod +x /etc/network/if-up.d/start-yourapp - 在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
相关产品推荐
相关产品推荐

