前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux如何添加自启动文件(添加在哪里)

Linux如何添加自启动文件(添加在哪里)

作者头像
用户9736681
发布2023-02-20 16:38:59
14.7K0
发布2023-02-20 16:38:59
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

本文说的启动文件指的是内核启动之后,启动根文件系统系统过程中添加自启动文件。

文件启动顺序

/etc/inittab > /etc/init.d/rcS 首先根文件系统会启动/etc/inittab,然后会启动 /etc/init.d/rcS这个文件,这个顺序在各个版本中基本都是保持不变的。怎么到这步的先不关心。我们从 /etc/init.d/rcS这个文件开始关注如何添加自己的启动文件。

这个rcS文件不同版本写法不一样。以我手上的一个为例看下

代码语言:javascript
复制
PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel#	Make sure proc is mounted#[ -d "/proc/1" ] || mount /proc##	Source defaults.#. /etc/default/rcS##	Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#trap ":" INT QUIT TSTP##	Call all parts in order.#exec /etc/init.d/rc S

这个文件最后执行/etc/init.d/rc 这个文件并传入参数S

rc部分文件如下

代码语言:javascript
复制
...	# First, run the KILL scripts.	if [ $previous != N ]	then		for i in /etc/rc$runlevel.d/K[0-9][0-9]*		do			# Check if the script is there.			[ ! -f $i ] && continue
			# Stop the service.			startup $i stop		done	fi
	# Now run the START scripts for this runlevel.	for i in /etc/rc$runlevel.d/S*	do		[ ! -f $i ] && continue
		if [ $previous != N ] && [ $previous != S ]		then			#			# Find start script in previous runlevel and			# stop script in this runlevel.			#			suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}			stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix			previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix			#			# If there is a start script in the previous level			# and _no_ stop script in this level, we don't			# have to re-start the service.			#			[ -f $previous_start ] && [ ! -f $stop ] && continue		fi		case "$runlevel" in			0|6)				startup $i stop				;;			*)				startup $i start				;;		esac....

这个文件可以看出很大一部分是寻找/etc/rcrunlevel.d/K[0-9][0-9]* 和/etc/rcrunlevel.d/S*这些文件来执行。

/etc/rc$runlevel.d/K[0-9][0-9]* 带K的是kill的意思,停止相关脚本运行。

/etc/rcrunlevel.d/S*带S是start的意思,开始相关脚本运行。那如果有两个文件名相同分别但分别带K和S(比如有文件/etc/rcrunlevel.d/K01test和/etc/rc

现在总结一下整体运行顺序: /etc/inittab -> /etc/init.d/rcS -> /etc/init.d/rc -> /etc/rcS.d文件夹中的脚本。

那我们在哪里增加自己的程序呢,可以在/etc/init.d/rcS这里增加,也可以在 /etc/rcS.d文件夹里增加。通过顺序可以看出/etc/init.d/rcS这个文件顺序在前,/etc/rcS.d会执行一些网络服务,如果自己的应用程序需要这些网络服务那就得在/etc/rcS.d文件里加,来保证程序的先后顺序。

添加文件

有rc.local这个文件

经常可以看到有些介绍让把自启动应用程序放入rc.local这个文件的,这个文件通常是最后启动的,一般在/etc/rcS.d这个文件里(链接文件)。这样的话我们就把自己的文件直接放入根目录下就可以了(可以根据自己的需要更改位置,此处只是举个例子),以下是在rc.local最后添加的程序。

代码语言:javascript
复制
cd /chmod 777 testfile./testfile &            // &表示此文件在后台运行

testfile就是自己的应用程序,需要赋予权限,rc.local同样也得赋予权限

没有rc.local这个文件

rc.local这个文件可有可没有,但是习惯用它的话把它添加进去就可以了,以添加这个文件为例。

1 把自己的文件直接放入根目录下(可以根据自己的需要更改位置,此处只是举个例子)

2 新建一个rc.local文件,文件名命名为rc.local即可,这是一个LOCAL 文件 (.local)。并为文件添加内容

代码语言:javascript
复制
#!/bin/sh           // #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。## This script will be executed *after* all the other init scripts.# You can put your own initialization stuff in herecd /                //文件位置根据自己的需求更改
chmod 777 testfile
./testfile &        // &表示此文件在后台运行

将文件放入/etc/init.d文件夹中,为文件赋予权限。

3 将rc.local生成链接文件S999rc.local,并将链接文件放入rc0.d,rc1.d,rc2.d,rc3.d,rc4.d,rc5.d,rc6.d,rcS.d这几个文件夹中。S999rc.local,S是指start,999是在循环的时候在最后执行。放入这几个文件夹是是因为不用考虑程序执行的是哪个文件夹(执行哪个文件夹是runlevel决定的),比较方便。

这样之后rc.local就会自动在最后执行,以后想加文件只改动rc.local这个文件就可以了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件启动顺序
  • 添加文件
    • 有rc.local这个文件
      • 没有rc.local这个文件
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档