【探究嵌入式Linux自启动服务】:sysvinit VS systemd
本文对比了传统的Sysvinit和现代systemd两种Linux服务管理机制。Sysvinit通过/etc/init.d/目录下按编号顺序执行的Shell脚本实现服务启动,简单直观但功能有限;systemd则采用.service配置文件,支持依赖管理、自动重启等高级功能。文章以S90camera为例,详细说明了如何编写Sysvinit自启动脚本,包括格式转换、权限设置和调试方法,并介绍了查找和终
1.浅谈sysvinit与systemd区别
(1)更传统的init脚本自启动 Sysvinit
-
机制:启动顺序靠
/etc/init.d/(或/etc/rc*.d/) 下的脚本,系统初始化时/etc/rcS或类似脚本会遍历这些目录,按编号顺序依次执行(如 S01、S02…S90)。
root@OK527:/etc/init.d# ls
S01syslogd S30dbus S50adb_start S70vsftpd rcS
S02klogd S30rpcbind S50lighttpd S80audio
S02sysctl S35iptables S50sshd S90camera
S10udev S40network S60Matrix_Browser S99swupdate_autorun
S20urandom S40nxp S60nfs 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
由上述rcS代码可知,其在遍历etc/init.d目录中以S开头的脚本,且序号越小,优先级越大
-
写法:就是 shell 脚本,内容随便写,但必须有执行权限,且格式为 Unix。
-
管理方式:一般用
service或直接/etc/init.d/xxx start/stop。 -
适用范围:嵌入式/早期 Linux/简化型发行版(如 busybox)。
-
优缺点:
-
优点:简单直观、兼容性好、资源占用低。
-
缺点:功能单一、不支持依赖管理、不会自动重启/监控、日志管理弱。
-
(2)systemd服务
机制:基于 .service 单元,放在 /etc/systemd/system/ 下。
写法:写 .service 配置文件,支持依赖、定时、日志、守护进程等丰富功能。
管理方式:systemctl start/stop/status/enable/disable xxx.service。
适用范围:现代主流 Linux(如 Ubuntu、CentOS、Debian、Arch)。
优缺点:
优点:支持依赖关系、自动重启、资源限制、标准日志、状态监控等。
缺点:配置比 shell 脚本略复杂,资源占用比传统 initd 略高。
(这个systemd后面再出一期讲解)
2.编写与启用自启动脚本
以S90camera为例
(1)编写脚本内容为:
#!/bin/sh
/mnt/csi_test_008_2 &
注意:第一行必须写
#!/bin/sh,表示这是 shell 脚本。之后内容写入你想要让其自启动执行的程序或操作
csi_test_008_2是将源码交叉编译后用于运行的二进制产物。
用 & 表示后台启动的进程即使关闭终端也不会自动停止,要自己 kill。即脚本内容可以在后台运行。
(2)确认脚本格式为UNIX
若格式不对则报错:
![]()
格式转换命令:
dos2unix /etc/init.d/S90camera
若你是在Windows下进行脚本的编写再上传到嵌入式系统的话,需要特别注意脚本格式!!,如上报错就是因为:脚本在 Windows 下写的,里面带了 Windows 风格的换行符(\r\n,也就是 ^M),导致 Linux 下解析器找不到 /bin/sh^M 这个路径。
(3)将编写好的脚本放入 /etc/init.d/
(4)赋予脚本执行权限
chmod +x /etc/init.d/S90camera
(5)系统启动时执行
系统会自动执行 /etc/init.d/ 目录下的脚本
(6)调试脚本是否可以单独运行
调试命令(以S90camera举例):
/etc/init.d/S90camera
3.查找并杀死自启动进程命令
ps aux
找到你脚本中启用的那一个操作或程序进程,并记下其进程PID
然后直接kill杀死进程即可
kill <PID>
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)