推荐使用 systemd 创建服务实现 shell 脚本开机自启动,需编写脚本、设置可执行权限、创建 /etc/systemd/system/myscript.service 单元文件、启用并启动服务;其次可选 /etc/rc.local(需确保 rc-local 服务启用);务必使用绝对路径并注意网络依赖。

在 Linux 系统中让 Shell 脚本开机自启动,关键在于选择合适的方法并确保脚本具备可执行权限、正确路径和必要依赖。不同发行版和初始化系统(SysV init、systemd)机制不同,主流现代系统(如 Ubuntu 16.04+、CentOS 7+、Debian 8+)默认使用 systemd,推荐优先采用 systemd 服务方式,更可靠、可控性强。
方法一:用 systemd 创建服务(推荐)
这是最规范、最推荐的方式,支持依赖管理、日志查看、启停控制和自动重启策略。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编写你的 Shell 脚本(例如
/opt/myscript.sh),开头必须包含正确的解释器声明(如#!/bin/bash),并赋予执行权限:chmod +x /opt/myscript.sh - 创建服务单元文件,如
/etc/systemd/system/myscript.service,内容示例:
[Unit] Description=My Custom Startup Script After=network.target [Service] Type=oneshot ExecStart=/opt/myscript.sh RemainAfterExit=yes User=root WorkingDirectory=/opt [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reloadsudo systemctl enable myscript.servicesudo systemctl start myscript.service - 验证是否生效:
sudo systemctl status myscript.service或查看日志journalctl -u myscript.service
方法二:添加到 /etc/rc.local(兼容旧习惯,但需注意)
部分发行版仍保留 /etc/rc.local 支持(尤其在未完全禁用该机制的 systemd 系统中),但需确认其服务已启用且脚本有执行权限。
- 检查
/etc/rc.local是否存在且可执行:ls -l /etc/rc.local,若无则新建并设权限:sudo touch /etc/rc.local && sudo chmod +x /etc/rc.local - 在文件中(
#!/bin/sh下方、exit 0上方)加入调用语句,例如:/opt/myscript.sh > /var/log/myscript.log 2>&1 - 确保 systemd 的 rc-local 服务已启用:
sudo systemctl enable rc-local(某些系统可能需要先创建/etc/systemd/system/rc-local.service) - 注意:Ubuntu 20.04+ 默认不带 rc.local,需手动配置;且该方式缺乏依赖控制,适合简单、无前置依赖的脚本。
注意事项与常见问题
-
路径要写绝对路径:脚本内所有命令、文件路径都建议用绝对路径(如
/usr/bin/curl而非curl),因为开机时环境变量(尤其是$PATH)可能不完整 -
等待网络就绪:如果脚本需要联网(如拉取远程配置),在 systemd 服务中设置
After=network-online.target并启用systemd-networkd-wait-online.service,或使用Wants=network-online.target -
避免阻塞启动:若脚本运行时间长或可能卡住,建议在
ExecStart=后加&后台运行,或改用Type=forking并配合PIDFile= -
调试技巧:首次测试时,先手动运行脚本看是否报错;再用
systemctl start xxx测试,通过journalctl查日志定位问题
不推荐的方式(慎用)
- 直接修改 /etc/init.d/ 或链接到 rcX.d:仅适用于传统 SysV init 系统,在 systemd 下兼容性差,易被忽略或失效
- 写入用户级启动(如 ~/.bashrc、~/.profile 或桌面 autostart):只在用户登录后执行,不属于“系统级开机自启”,且不适用于无图形、无交互登录的场景(如服务器)
- crontab @reboot:虽能触发,但执行环境受限、无依赖控制、错误难追踪,仅适合极轻量临时任务










