自动化第一步:实现Linux系统开机自动干活
你有没有遇到过这样的场景:每天上班第一件事就是打开终端,敲一堆命令启动服务、运行脚本、拉取数据?重复操作不仅耗时,还容易出错。其实,Linux早就为你准备好了“自动化开关”——只要设置一次,系统开机时就能自动完成这些固定任务。
本文不讲抽象概念,不堆术语,只聚焦一件事:让你的Linux系统在开机后自动执行指定脚本。无论你是刚接触Linux的新手,还是想优化工作流的开发者,都能照着一步步操作,10分钟内搞定。我们用最通用、最稳定的方式实现,兼容Ubuntu 16.04及后续主流版本(包括20.04、22.04),不依赖桌面环境,不折腾systemd单元文件,真正“开箱即用”。
1. 明确目标:你要让系统开机后做什么
在动手前,请先问自己一个问题:开机后最想自动完成哪件具体的事?
不是“启动服务”,而是更具体的动作,比如:
- 自动运行一个Python数据采集脚本
- 启动本地Web服务(如Flask或Node.js)
- 拉取Git仓库最新代码并编译
- 创建日志文件、写入启动时间戳
- 运行仿真程序(如博文中的
./sim/sim)
小白友好提示:本文示例以“写入一句问候语到文件”为最小可验证动作,确保你能看到效果;完成后,你只需把其中的命令替换成自己的实际任务即可,逻辑完全一致。
2. 编写你的第一个自动执行脚本
脚本是自动化的“大脑”,它告诉系统“该干什么”。我们从最简单的开始,确保每一步都清晰可控。
2.1 创建脚本文件
选择一个你熟悉且有读写权限的目录,比如/home/你的用户名/scripts(注意替换你的用户名)。如果目录不存在,先创建:
mkdir -p /home/你的用户名/scripts进入该目录,新建一个名为auto_run_test.sh的文件:
cd /home/你的用户名/scripts nano auto_run_test.sh推荐使用
nano而非vim,对新手更友好。如需退出nano,按Ctrl+X→ 输入Y确认保存 → 回车确认文件名。
在文件中输入以下内容(请逐字复制,注意符号全为英文半角):
#!/bin/bash # 记录启动时间,写入output.txt echo "System started at $(date)" > /home/你的用户名/scripts/output.txt # 可选:添加你想做的其他事,例如: # cd /path/to/your/project # python3 main.py & # ./my_app --daemon关键细节说明:
- 第一行
#!/bin/bash是“shebang”,必须严格写成这样,不能多空格、不能写错大小写; $(date)会动态插入当前时间,让每次启动记录都不同,方便你验证是否真正在开机时运行;- 所有路径请用绝对路径(以
/开头),避免因开机时工作目录不确定导致失败; - 如果要后台运行程序(如服务),记得在命令末尾加
&,否则脚本会卡住,影响系统启动。
2.2 设置脚本执行权限
Linux默认不允许直接运行.sh文件,必须赋予“可执行”权限:
chmod +x auto_run_test.sh验证是否成功:运行ls -l auto_run_test.sh,若输出中包含x(如-rwxr-xr-x),说明权限已生效。
3. 让脚本在开机时被调用:两种可靠方案
Linux启动流程中,有一个经典且稳定的“钩子”位置:/etc/rc.local。它会在所有基础服务启动完毕后、用户登录前执行,非常适合运行自定义脚本。但部分新版Ubuntu默认不启用该机制,因此我们提供主方案(rc.local)+ 备用方案(/etc/profile),覆盖所有常见情况。
3.1 主方案:通过 /etc/rc.local 启动(推荐)
步骤1:检查rc.local是否存在并启用
首先确认文件是否存在:
ls -l /etc/rc.local- 若显示
No such file or directory:需手动创建; - 若存在但权限为只读(如
-rw-r--r--):需修改权限; - 若存在且内容为空或只有注释:可直接编辑。
统一处理方式(一键执行):
sudo nano /etc/rc.local将以下完整内容粘贴进去(覆盖原有内容):
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # >>>>> 从这里开始添加你的命令 <<<<< cd /home/你的用户名/scripts ./auto_run_test.sh # <<<<< 添加结束 >>>>> exit 0重点说明:
cd命令必须写,确保脚本在正确路径下执行;- 直接用
./auto_run_test.sh调用(前面已设执行权限),不要写sh auto_run_test.sh或bash auto_run_test.sh,避免子shell环境问题; exit 0必须保留且位于文件末尾,这是rc.local规范要求,缺一不可。
步骤2:赋予rc.local可执行权限
sudo chmod +x /etc/rc.local验证:运行sudo systemctl status rc-local,若显示active (exited),说明已成功启用。
3.2 备用方案:追加到 /etc/profile(当rc.local不可用时)
某些精简版系统或容器环境可能没有rc.local。此时,我们利用用户登录时必读的全局配置文件/etc/profile—— 它在每次终端会话启动时执行,对桌面用户和SSH登录均有效。
注意:此方式在图形界面自动登录时可能延迟触发,但对绝大多数日常使用场景足够可靠。
执行:
echo "" | sudo tee -a /etc/profile echo "# Auto-run at login" | sudo tee -a /etc/profile echo "cd /home/你的用户名/scripts && ./auto_run_test.sh" | sudo tee -a /etc/profile验证:新开一个终端窗口(或执行source /etc/profile),检查output.txt是否更新。
4. 实战验证:重启后看效果
一切设置完成后,最关键的一步来了:真实重启验证。
sudo reboot等待系统完全重启、登录桌面或进入终端后,立即检查效果:
cat /home/你的用户名/scripts/output.txt你应该看到类似这样的输出:
System started at Mon Jun 10 09:23:45 CST 2024这行文字的日期时间,就是本次开机的确切时刻——证明脚本已在系统启动流程中成功执行。
进阶验证(可选):
- 查看系统日志确认执行时间:
sudo journalctl -u rc-local --no-pager | tail -10 - 如果脚本中启动了后台服务,用
ps aux | grep your_command检查进程是否存在。
5. 常见问题与避坑指南
即使严格按照步骤操作,也可能遇到“看似设置成功,但实际没运行”的情况。以下是高频问题及解决方法,全部来自真实踩坑经验。
5.1 脚本执行了,但文件没生成或内容为空
原因:脚本中使用了相对路径(如./output.txt),而开机时当前工作目录不是脚本所在目录。
解决:所有文件路径必须用绝对路径。
错误写法:echo "hello" > output.txt
正确写法:echo "hello" > /home/你的用户名/scripts/output.txt
5.2 rc.local设置了,但重启后无反应
原因:rc-local服务未启用,或exit 0缺失/位置错误。
解决:
- 运行
sudo systemctl enable rc-local强制启用服务; - 重新检查
/etc/rc.local文件末尾是否严格为exit 0,且前面无空行; - 运行
sudo systemctl daemon-reload && sudo systemctl restart rc-local刷新服务。
5.3 脚本里启动的程序一闪而过,查不到进程
原因:前台运行阻塞了脚本,或程序需要交互式环境。
解决:
- 在命令末尾加
&放入后台,如python3 server.py &; - 如需守护进程,加
nohup和重定向日志:nohup python3 server.py > /var/log/myapp.log 2>&1 &; - 图形程序(如浏览器)不建议在此启动,应改用桌面自动启动项。
5.4 使用备用方案(/etc/profile)时,脚本只在打开终端时运行
原因:/etc/profile仅在登录shell中读取,图形界面自动登录可能绕过它。
解决:优先使用主方案(rc.local);若必须用profile,可配合桌面环境的“启动应用程序”设置(如GNOME的Startup Applications)作为补充。
6. 进阶应用:从单任务到自动化工作流
当你熟练掌握开机自动执行后,就可以组合多个脚本,构建属于自己的“开机自动化流水线”。以下是一些真实可用的思路:
6.1 分层管理:用主脚本调度子任务
创建startup_master.sh,内容如下:
#!/bin/bash # 主调度脚本:按顺序执行多个任务 echo "$(date): Starting automation..." >> /var/log/startup.log # 任务1:同步时间 sudo timedatectl set-ntp true # 任务2:拉取最新代码 cd /home/你的用户名/myproject git pull origin main # 任务3:重启服务 sudo systemctl restart myweb.service echo "$(date): Automation completed." >> /var/log/startup.log然后在rc.local中只调用这一个脚本。好处是逻辑清晰、便于维护、日志集中。
6.2 安全加固:避免权限滥用
- 不要给
/etc/rc.local或脚本本身设置777权限(如参考博文所提),这存在安全风险; - 推荐权限:脚本
755(chmod 755 xxx.sh),rc.local755,属主为root; - 敏感操作(如
sudo)尽量在脚本内完成,避免在rc.local中直接写sudo命令。
6.3 日志追踪:让每次启动都可追溯
在脚本开头添加:
exec >> /var/log/my_startup.log 2>&1 echo "=== $(date) ==="所有后续echo和命令输出都会自动记录到日志文件,排查问题时一目了然。
7. 总结:你已经迈出了自动化的重要一步
恭喜你!现在你的Linux系统不再是“静默启动”,而是拥有了“主动干活”的能力。回顾整个过程,你掌握了:
- 如何编写一个功能明确、路径规范的Shell脚本;
- 如何通过
rc.local这一稳定机制实现开机自动执行; - 当主方案失效时,如何用
/etc/profile快速兜底; - 如何验证效果、排查常见故障、规避典型陷阱;
- 如何从小脚本扩展为可维护的自动化工作流。
这不仅是技术操作,更是一种思维转变:把重复劳动交给机器,把创造力留给自己。接下来,你可以把任何日常任务封装进脚本——监控磁盘空间、自动备份重要文件、定时发送状态邮件……自动化的大门,已经为你敞开。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。