busybox环境下需通过/etc/inittab→/etc/init.d/rcs→sxx脚本链实现开机自启:确认busybox init后,编写符合命名与结构规范的sxx脚本,赋权并确保rcs调用循环存在,按依赖关系设置编号,最后重启验证。

嵌入式设备每次上电后都要手动敲命令启动服务,既耽误调试时间又无法满足工业现场“断电自恢复”的基本要求。在BusyBox环境下,正确设置开机启动必须绕过直接改inittab的常见误区,严格遵循其init进程的执行链条:/etc/inittab → /etc/init.d/rcS → /etc/init.d/Sxx*脚本。
确认系统使用的是BusyBox init
执行 ps 1 查看PID为1的进程路径,输出应为 /sbin/init 或 /linuxrc;再运行 readlink -f /sbin/init,若返回路径含 busybox 字样,则确认为BusyBox init环境。【若显示systemd或sysvinit,则本文方法完全不适用】
检查 /etc/inittab 文件是否存在且包含 ::sysinit:/etc/init.d/rcS 这一行——这是整个Sxx脚本机制生效的前提。
编写标准Sxx启动脚本
进入 /etc/init.d/ 目录,用vi创建脚本文件,命名格式必须为大写S开头+两位数字+服务名,例如 S90myapp:
脚本内容需包含start/stop/restart三类操作分支,并使用 start-stop-daemon 管理进程生命周期。最小可用模板如下:
#!/bin/sh<br>DAEMON=/usr/bin/myapp<br>PIDFILE=/var/run/myapp.pid<br><br>case "$1" in<br>start)<br> echo "Starting myapp"<br> start-stop-daemon --start --quiet --make-pidfile --pidfile "$PIDFILE" --exec "$DAEMON"<br> ;<br>stop)<br> echo "Stopping myapp"<br> start-stop-daemon --stop --quiet --pidfile "$PIDFILE"<br> rm -f "$PIDFILE"<br> ;<br>restart)<br> $0 stop<br> sleep 1<br> $0 start<br> ;<br>*)<br> echo "Usage: $0 {start|stop|restart}"<br> exit 1<br>esac<br>exit 0
注意:脚本第一行必须是 #!/bin/sh,且不能有多余空格或BOM头;【若脚本无执行权限或shebang错误,rcS执行时会静默失败】
注册并验证启动顺序
第一步:赋予脚本可执行权限:chmod +x /etc/init.d/S90myapp
第二步:确保 /etc/init.d/rcS 文件存在且可读,其末尾应有类似以下循环语句:
for i in /etc/init.d/S??*; do<br> [ -x "$i" ] && $i start<br>done
第三步:检查脚本编号是否合理。Sxx中的xx决定执行顺序,S10早于S90;若你的服务依赖网络,编号必须大于S40network;若依赖日志服务,则需晚于S01syslogd。
第四步:手动触发验证:/etc/init.d/S90myapp start,再执行 ps -ef | grep myapp 确认进程已运行。
重启设备完成最终验证
执行 reboot 重启设备。
系统启动完毕后,立即运行 ps -ef | grep myapp,若看到对应进程且PID不为1,则说明开机自启已生效。
若未出现进程,立即查看 dmesg 输出和 /var/log/messages,重点排查PATH环境变量缺失、依赖服务未就绪、或脚本中命令路径写错等问题。











