嵌入式系统中程序自启动方法

在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源。如何让自己的应用程序自动启动呢?    在Linux系统中,配置应用程序自动启动的方法有以下三种:
1.通过/Linuxrc脚本直接启动
Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息。初始化完成后,通常调用的是init,通过loader调用init内的init=/app_program语句(通过loader向核心传入init=/program可以定制首先运行的程序)
比如在桌面Linux系统中,init进程会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用开发中,可以根据实际情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了,在这里可以采用比较灵活的措施。
2.在/etc/init.d下添加启动脚本

主要用来启动一些系统服务,根据runlevel执行rcx.d, 而在rcx.d中都会在最后调用rc.local

一般情况下,大多数的Linux操作系统使用/etc/init.d/(或/etc/rc.d/init.d)下的脚本来配置应用程序的自动启动。
例如,在某些Linux系统中,corn程序通过/etc/init.d/corn脚本启动,Apache通过/etc/init.d/httpd启动,syslogd通过/etc/init.d/syslogd启动,而sshd则通过/etc/init.d/sshd脚本启动。
通常这些脚本通过来自特定rc.d目录的符号链接运行。为了配置从哪个rc.d目录运行脚本,Linux系统提供了许多不同的工具,同时也可以手工进行配置。Linux系统有一个包含所有实际启动脚本文件的目录。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同时对应每个运行级别(runlevel)又有一个另外的目录,它们可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。这些目录中的文件通常是指向实际脚本文件的符号链接。
3.直接在/etc/rc.d/rc.local脚本中添加命令
在Linux系统中,有一个类似Windows系统中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系统开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的这个文件中。因此可以编辑rc.local文件,将要执行的程序(命令)添加到该文件夹中。Linux系统在启动后还未登录前,将自动执行该程序(命令),达到开机自动运行用户的应用程序的目的。

运行级别

Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别的原理:
1.在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)(注:自己常用的有/etc/init.d/network...)
2.在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3.rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4.系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
     对于以K开头的文件,系统将终止对应的服务
     对于以S开头的文件,系统将启动对应的服务
5.查看运行级别用:runlevel
6.进入其它运行级别用:init N
7.另外init0为关机,init 6为重启系统

来自知乎
下面是我的理解
init 文件名,指的是系统启动的第一个脚本
init.d 目录名,目录内放的是各个服务的启动脚本,比如sshd、httpd等
rcX.d 目录名,后面的X代表着每个运行级别。目录内有每个服务在init.d内启动脚本的链接文件,根据链接文件的名字来的启动状态。K开头表示不启动服务,S打头表示启动服务
rc.local 链接文件,指到/etc/rc.d/rc.local。是系统初始化及服务均启动完毕后,最后执行的一个脚本,一些简单的脚本可以放到其中
 

linux系统开机流程

1、机器开机通电bios质检,质检通过后,bios会根据boot菜单,选择从硬盘启动。

2。读取硬盘中的MBR(主引导记录),加载引导程序(linux中是grub),grub程序会加载系统kernel和虚拟文件系统。

3、系统会运行init程序,该进程会读取/etc/inittab配置文件,决定运行级别,运行/etc/rc.d/rc.sysinit脚本对系统进行初始化,该脚本会设置系统时间,主机名,开启卷管理,以读写的方式重挂root文件系统,挂载本地文件系统,开启本地磁盘配额,开启交换空间。

4、运行该运行级别下的/etc/rc.d/rcN.d/下的脚本,开启系统服务进程。

5、读取/etc/rc.d/rc.local下的命令,并逐条运行。

6、启动虚拟终端,进入登录界面。

现实中碰到的问题

1. 想自动启动一个应用程序,而应用程序依赖于一个环境变量

2. 自动启动的应用程序可以使用Ctrl+C终止

对于上面两个需求,碰到多个问题

1. 将环境变量加入到/etc/profile中,然后/etc/rc.local中使用source将这个环境变量使能,但是由于rc.local脚本开始是#!bin/sh即为dash而不是bash, 导致从log可以看出rc.local执行失败,当然最后把#!bin/sh->#!bin/bash即可

2. 如果在rc.local中执行./application则开机启动会一直停在rc.local中,导致无法exit,完成启动;如果./application &则会Ctr+C无法退出,目前使用后者

#!bin/bash -e
source /etc/profile
(
sleep
cd /usr/local
./application
)&
 

[开机启动]Linux开机自启和运行级别的更多相关文章

  1. Linux系统有7个运行级别(runlevel)

    Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别 ...

  2. linux系统的7种运行级别

    Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多 ...

  3. [转]linux系统的7种运行级别

    转自:http://blog.chinaunix.net/uid-22746363-id-383989.html Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行 ...

  4. 开机启动+Linux发送邮件

    需求:检测Linux上Tomcat是否允许,挂了的话给运维发送邮件通知 实现:编写脚本一直检测Tomcat进程是否存活,否则给运维发送邮件,脚本设置开机时自动启动 1.Linux发送邮件 vim /e ...

  5. Linux设置程序开机启动-tomcat开机启动

    假设我有一个tomcat应用需要开机启动. 前提你的JAVA环境变量已经配置好没有问题,检测方法如图 然后找到tomcat的目录,我的目录是 /home/yuqing_4.0/tomcat_share ...

  6. 【C#】 开机启动/取消开机启动

    1.开机启动 using Microsoft.Win32; RegistryKey runKey = Registry.LocalMachine.CreateSubKey(@"SOFTWAR ...

  7. Linux系统初始化过程及运行级别简介

    Linux开机过程: 1 开机自检(BIOS):初始化硬件,查找启动介质 2 MBR引导 3 GRUB引导菜单:GRUB程序安装在Bootloader 4 加载内核(kernel) 5 运行INIT进 ...

  8. Linux下tomcat作为守护进程运行(开机启动、以指定的用户运行、解决非root身份不能绑定1024以下端口的问题)的配置方法

    如题. 参考资料: http://www.jdiy.org/read.jd?id=y0haaynq1w http://blog.csdn.net/shw2004/article/details/578 ...

  9. Linux的文件帮助和运行级别

    man命令相关:man -1 +参数 表示查询第几章的帮助说明man -k +参数 表示以该参数为关键字查询所有相关命令或文件命令 --help 简单查询命令使用说明具体的帮助文档存储在/usr/sh ...

随机推荐

  1. c# String.IndexOf 方法 string查找字符串

    c# String.IndexOf 方法 (value, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...

  2. UI设计经常使用站点

    前期:http://www.zcool.com.cn/ 中期:http://www.ui.cn/ 后期:https://dribbble.com/

  3. nGrinder工具进行接口性能测试

    1.背景 之前在这篇文章中性能测试初探—接口性能测试介绍过nGrinder,本文将介绍在nGrinder脚本中使用资源文件中数据作为接口参数和解析生成的CSV结果,生成TPS标准差,TPS波动率,最小 ...

  4. 编写nios-shell时想到的问题-回车vs换行

    在编写nios上类shell用户交互代码时.由于要检測终端输入字符.所以想到了这个问题,故分析之. 回车符的ascii码,ASCII码13 '\r' 换行符的ascii码.ASCII码10 '\n' ...

  5. Python 3 操作json 文件

    背景 json 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成. 一般表现形式是一个无序的 键值对 的集合. 资料: 官方文档: https://docs.python.org ...

  6. [Done]ibatis/mybatis: java.lang.NoSuchMethodException

    异常描述: Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating interface cn. ...

  7. ORACLE expdp/impdp详解(转)

    ORCALE10G提供了新的导入导出工具,数据泵.Oracle官方对此的形容是:Oracle DataPump technology enables Very High-Speed movement ...

  8. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  9. 【NEWS】 ADempiere发布ADempiere 3.8.0路线图【2013年7月28日】

    发布源:http://osssme.org/cms/?q=node/17 本以为ADempiere”已死“,但是看到ADempiere的WIKI上大概在从5月28日开始添加WIKI以来,经过多次更新后 ...

  10. C#:使用Window自带函数(如:user32.dll)

    [DllImport("user32.dll", EntryPoint = "GetScrollInfo", CallingConvention = Calli ...