yocto添加开机启动编译脚本

yocto添加开机启动脚本

在平台开发时我们经常会遇到在编译时想让一个程序开机就自动启动,且这个程序必须在依赖的程序启动后才启动。比如等模组拨号成功后才开始FOTA的check。

这篇文章将介绍下如何将一个服务程序在一些特定的时候启动

下面将以start_manager_server_le为例,他是一个运行脚本,欲控制开机启动的程序为/usr/bin/qmanager_server。

start_manager_server_le的内容如下:

#! /bin/sh

#qmanager_server是你想要开机运行的程序
DAEMON=/usr/bin/qmanager_server 

set -e

case "$1" in
  start)
        echo -n "Starting qmanager_server: "
        echo "QMS:start" > /dev/kmsg
        start-stop-daemon -S -b -x $DAEMON
        echo "done"
        ;;
  stop)
        echo -n "Stopping qmanager_server: "
        rmmod qcom_emac
        rmmod at803x
        rmmod qca8337
        rmmod of_mdio
        rmmod libphy
        start-stop-daemon -K -x $DAEMON
        echo "done"
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage $0 { start | stop | restart}" >&2
        exit 1
        ;;
esac

exit 0

在build目录里增加一个bb文件 poky/meta-bsp/recipes-prop/quectel/qmanager_git.bb。bb文件是用来控制编译过程的

DESCRIPTION = " Manager Modules"
PR = "r21"

DEPENDS = "diag dsutils qmi-framework data"

S       =  "${WORKDIR}/manager"
SRC_DIR =  "${WORKSPACE}/manager/"

INITSCRIPT_NAME = "start_manager_server_le"
INITSCRIPT_PARAMS = "start 99 2 3 4 5 ."

inherit update-rc.d

do_install_append() {
    install -m 0755 ${WORKDIR}/manager/server/src/start_manager_server_le -D ${D}${sysconfdir}/init.d/start_manager_server_le

}

FILES_${PN} += "${base_libdir}/firmware/wlan/qca_cld"

其中我们只需要关注下面这三行

INITSCRIPT_NAME = "start_manager_server_le"
INITSCRIPT_PARAMS = "start 99 2 3 4 5 ."

inherit update-rc.d

这三个参数的介绍如下

# Inherit the update-rc.d.bbclass file located in openembedded/classes/.
# This will take care of setting up startup links when the package is
# installed.
inherit update-rc.d


# Tell the update-rc.d package which program will be used as the startup
# script.
# The script will be called with the "start" command at system
# startup, the "stop" command at system shutdown, and the "restart" command
# when the package is updated.
INITSCRIPT_NAME = "init-example-script"

# Run the command at step 90 during startup, and step 10 during shutdown.
# Because the numbers go from 00 - 99, larger numbers will be run later on.
# If your program is required for system startup, put a low number here.
# If it's user-facing or less critical for system startup, put a higher
# number here.
# As a tradition, the shutdown number should be 100-startup_number. That
# way scripts are stopped in the reverse order they were started in. Since
# our startup number here is 90, the shutdown number will be 100-90 or 10.
INITSCRIPT_PARAMS = "defaults 90 10"

意思是在bb文件里加上这三行后,编译时会调用update-rc.d,在制作的文件系统里的/etc/rcX.d 路径下创建一个指向将 /etc/ini.d/INITSCRIPT_NAME 的软链接(rcX.d里的X是当前系统的runlevel,可以通过runlevel查看,注意不是编译机的runlevel)

其中INITSCRIPT_PARAMS这个参数是执行update-rc.d命令时传递过去的参数

/etc路径下有多个以rc开头的文件夹:

/etc # ls -l |grep  rc
ls -l |grep  rc
-rw-r--r--    1 root     root          1633 Aug  9 09:57 inputrc
drwxr-xr-x    3 root     root           368 Aug 13 01:31 rc.d
drwxr-xr-x    2 root     root          2656 Aug  9 10:11 rc0.d
drwxr-xr-x    2 root     root          2136 Aug  9 10:11 rc1.d
drwxr-xr-x    2 root     root          3456 Aug  9 10:11 rc2.d
drwxr-xr-x    2 root     root          3456 Aug  9 10:11 rc3.d
drwxr-xr-x    2 root     root          3384 Aug  9 10:11 rc4.d
drwxr-xr-x    2 root     root          3760 Aug  9 10:11 rc5.d
drwxr-xr-x    2 root     root          2592 Aug  9 10:11 rc6.d
drwxr-xr-x    2 root     root          1648 Aug  9 10:11 rcS.d

rc后面的数字代表的是runlevel,系统在一个时间点只有一个runlevel,可以通过runlevel命令来查看当前系统的runlevel

/etc/rc5.d # runlevel
runlevel
N 5

linux的runleve有如下类别
在这里插入图片描述

另外在每个runlevel下有很多的sub runlevel,序号从0-99,序号越大启动越靠后。
/etc/rc[runlevel].d/路径下的脚本是会开机启动的。且这个路径下的启动脚本是根据sub runlevel的大小先后启动的

Example:

INITSCRIPT_PARAMS = "start 99 2 3 4 5 ."

99代表的是sub runlevel,2代表的是runlevel

因此烧完版本后你可以看到/etc/rc2.d路径下多了一个 S99start_manager_server_le的软连接,软连接前面的S99就是这个脚本的sub runlevel.

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiqingyang2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值