嵌入式linux设置开机自动运行程序(基于busyboxinit)(代码片段)

NaisuXu NaisuXu     2023-03-16     487

关键词:

文章目录

目的

开机自动运行程序,或者说系统启动时自动运行程序,这是经常会需要用到的功能。这个功能通常依托于 init 程序实现。 init 是Linux在内核启动完成之后第一个启动的程序,该程序会运行一些特定位置的脚本,相当于实现开机运行程序的效果。

在常见的Linux发行版中 init 程序主要为 SysVinitSystemd 。在嵌入式Linux中根文件系统通常使用 buildroot 来建立, buildroot 默认是基于 BusyBox 构建根文件系统的,这种方式下默认的 init 程序可以称其为 BusyBox init 。 这篇文章将介绍通过 BusyBox init 实现开机自动运行程序的功能。

BusyBox init启动流程

inittab

BusyBox init 会在启动后读取 /etc/ 目录下的 inittab 文件,下面是其内容样式:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/mkdir -p /run/lock/subsys
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

可以从注释中看到这个文件记录的是一条条按照一定规则编写的语句。

BusyBox init 会在启动后执行第三个字段为 sysinit 的语句中的命令,会在关机时执行第三个字段为 shutdown 的语句中的命令。

在这里添加语句就可以实现开机运行程序了,不过一般不推荐这么做。

rcS 和 rcK

从上面文件中可以看到 sysinit 系列的语句最后一条会去执行 /etc/init.d/ 目录下的 rcS 脚本,也即开机时其它工作完成后会执行 rcS 这个脚本。同样的会在关机时先执行 /etc/init.d/ 目录下的 rcK 脚本。这两个脚本内容如下:

rcS

#!/bin/sh


# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start
            ;;
    esac
done

rcK

#!/bin/sh


# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set stop
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i stop
            ;;
    esac
done

可以看到 rcS 脚本会依据文件名排序依次读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 start 方法。同用的 rcK 脚本会依据文件名逆排序读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 stop 方法。

设置开机自动运行程序

对于我们需要设置开机运行程序而言,可以编写名字为 S??* 格式的脚本文件存放到 /etc/init.d/ 目录下,这样它就会在开机时被调用执行其中的 start 方法了。

名字为 S??* 格式的脚本文件默认在 /etc/init.d/ 目录下已经有一些了:

我们可以参考它们来编写自己的脚本开机脚本,这里创建名为 S77test 的文件,其中内容如下:

#!/bin/sh

umask 077

start() 
        echo "Starting test log: Naisu is coming!!!"


stop() 
        echo "Stopping test log: Naisu is leaving!!!"


restart() 
        stop
        start


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

exit $?

备注1:各个函数中不建议出现长时间阻塞的操作,如果有需求建议在命令后面加上 (空格)& 放到后台运行;
备注2:行尾必须是以只有换行符形式,不能是windows上回车加换行的形式;

调整脚本权限:

chmod 755 /etc/init.d/S77test

下面就是脚本在开关机时运行的演示了:

总结

在使用 BusyBox init 的嵌入式Linux系统中设置开机自动运行程序并不复杂,只要了解其脚本调用流程基本就可以了。

linux设置开机自动运行脚本

参考技术A创建脚本,文件后缀.sh创建systemd启动服,文件后缀.service从服务的内容可以看出来,最终还是会调用/home/luckyboy/auto_run_script.sh这个脚本。 查看详情

linux笔记:开机自动运行程序(代码片段)

...实现rc.local注意事项SysVinit和Systemd的联系与区别总结目的开机自动运行程序,或者说系统启动时自动运行程序,这是经常会需要用到的功能。在linux中实现随系统启动运行程序的功能通常有三种(或者说两种)方法... 查看详情

linux开机自启动命令

...想要在linux开机的时候自启动相关的程序。那我们要怎么设置呢?下面由我为大家整理了linux下开机自启动命令的相关知识,希望对大家有所帮助!  linux下开机自启动命令  1.开机启动时自动运行程序  Linux加载后,它将初始... 查看详情

嵌入式linux如何以root身份自动登录如何开机自动执行脚本文件

...38400tty6如果不在这个文件下操作,那我应该如是实现呢?嵌入式Linux如何以root身份自动登录并开机自动执行脚本文件下面操作步骤记录如下:要设置自启动程序需要解决两个问题:1、 查看详情

ubuntu设置开机自动启动脚本/程序的各种方法

一、Ubuntu添加开机自动启动程序的方法1.开机启动时自动运行程序Linux加载后,它将初始化硬件和设备驱动,然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在/etc/rc或/etc/rc.d... 查看详情

c#.netform设置/取消开机自动运行,判断程序是否已经设置成开机自动启动(转载)

#region//开机自动运行       privatevoidCB_Auto_CheckedChanged(objectsender,EventArgse)       {//CB_Auto是一个Checkbox,IsAutoRun是个布尔变量,用于控制是 查看详情

wpf设置程序开机自动运行(+注册表项)

#region设置程序开机自动运行(+注册表项)RegistryKeyrgkRun=Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);if(rgkRun==null){rgkRun=Registry.LocalMachine.CreateSubKey("SOFTWAR 查看详情

linux怎么设置开机自动挂载

参考技术A磁盘自动挂载有三种方法(按推荐度排序):1.写在/etc/fstab里面,如图:2.把完整的挂载命令写在/etc/rc.local里面,这个文件是linux启动最后一个运行的脚本,写在里面的可以在开机前最后一个脚本执行。3.linux的触发式... 查看详情

qt设置应用程序开机自动运行

[cpp] viewplain copyvoid Widget::Readregedit()  {      QString path;      QDir dir;   &nbs 查看详情

linux下开机启动脚本程序

...,使用各种编译器运行程序,但是有时候我们需要在系统开机的时候就自动运行这些程序,下面我们就来看一下在Linux下将脚本设定成开机自动运行的方法。Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以... 查看详情

ubuntu设置开机自动启动脚本/程序的各种方法

一、Ubuntu添加开机自动启动程序的方法1.开机启动时自动运行程序Linux加载后,它将初始化硬件和设备驱动,然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在/etc/rc或/etc/rc.d... 查看详情

linux自动启动程序用ctrl+c无法终止

...应用程序,但系统启动后ctrl+c无法将其关闭。我是移植到嵌入式平台的程序,是不是这和移植的脚本等有关可是我在另外一个版本的系统,却可以终止在/etc/init.d/rcS中的脚本有没有懂的人回答一下嘛!!!!!!!!!... 查看详情

linux设置开机自启动

参考技术Alinux设置开机自启动执行命令:执行命令:编辑"/etc/rc.local",添加你想开机运行的命令运行程序脚本:然后在文件最后一行添加要执行程序的全路径。例如,每次开机时要执行一个hello.sh,这个脚本放在/usr下面,那就可... 查看详情

win10如何设置通电自动开机

...始时间,也就是运行命令的时间.因为可以马上执行,所以就设置为想开机的时刻。8、执行操作选择[启动程序],因为需要执行命令。9、程序就填shutdown命令,参数就设置成-s-t10,意为23点后的10秒执行开机。10、设置完成后,任务就存在... 查看详情

树莓派进阶之路(033)-开机启动自定义脚本

...动服务。参考了一下文档:Linux开机启动程序详解Linux中设置服务自启动的三种方式,linux服务的开机启动和运行级别,linux系统的7种运行级别,ubuntu下设置开机启动服务,Ubuntu15.x/CentOS7.x以后设置开机启动,添加自定义系统服务,自... 查看详情

linux下怎么查看crontab是不是自动启动了,普通用户下要怎么设置为开机自动启动crond服务呢?

...ncrontab默认就是开机启动的,普通用户要有sudo的权限才能设置开机启动 查看详情

linux开机自动启动(自启动)脚本程序

ARM板设置开机自启动应用程序我在哪个/etc/profile文件最后加上了我们程序的启动脚本,但是启动效果让我还是感觉有点迷惑,因为发现xshell没法执行reboot命令了,然后我注释了启动脚本,又能reboot了 查看详情

linux系统centos7版本怎么设置每天自动开关机?

linux系统centos7版本怎么设置每天自动重启参考技术A自动关机,就是定义个at命令;开机的话,看bios里有定时开机的不,直到运行完成不能有多余的输入操作 参考技术B自动重启用cron,开机需要扩展卡,否则永远无法实现本回答... 查看详情