长沙网站设计服务商php网站服务建设
2026/4/17 1:31:54 网站建设 项目流程
长沙网站设计服务商,php网站服务建设,建立网站的英文怎么说,合肥关键词排名优化系统运行级别怎么看#xff1f;配合测试脚本轻松理解 你有没有遇到过这样的问题#xff1a;写好了开机启动脚本#xff0c;却不知道它到底在哪个阶段被加载#xff1f;改完 /etc/init.d/mytest.sh#xff0c;重启后发现脚本压根没执行——不是代码错了#xff0c;而是根…系统运行级别怎么看配合测试脚本轻松理解你有没有遇到过这样的问题写好了开机启动脚本却不知道它到底在哪个阶段被加载改完/etc/init.d/mytest.sh重启后发现脚本压根没执行——不是代码错了而是根本没被系统“看见”。其实背后的关键就是系统运行级别Runlevel。它像一张启动时刻的“时间表”决定了哪些服务该在什么时候启动、哪些该停止。本文不讲抽象概念不堆术语就用一个真实可运行的测试脚本带你一步步看清你的系统当前在哪个级别运行这个级别对应哪些启动目录脚本要放在哪里、怎么命名、按什么顺序执行才能真正生效。整个过程在 CentOS 和 Ubuntu 系统上都适用不需要安装额外软件所有命令都是系统自带。哪怕你刚接触 Linux 不久只要能敲几行命令、看懂文件名含义就能彻底搞明白开机启动背后的逻辑。1. 先写一个看得见效果的测试脚本与其对着空脚本猜来猜去不如先写一个“会说话”的脚本——它每次执行时都会在系统日志里留下明确痕迹让你一眼确认它真的运行了。我们把它放在标准位置/etc/init.d/mytest.sh#!/bin/bash ### BEGIN INIT INFO # Provides: mytest # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Test startup script # Description: A simple script to log boot time execution ### END INIT INFO case $1 in start) echo $(date): mytest.sh started successfully /var/log/mytest.log ;; stop) echo $(date): mytest.sh stopped /var/log/mytest.log ;; restart) $0 stop $0 start ;; *) echo Usage: $0 {start|stop|restart} exit 1 ;; esac exit 0这段脚本非常轻量只做一件事当被要求start时往/var/log/mytest.log文件里写一行带时间戳的日志。它不依赖数据库、不调用网络服务纯粹用来验证“启动流程是否走通”。保存后给它执行权限sudo chmod x /etc/init.d/mytest.sh现在脚本已就位但它还不会自动运行——因为系统还不知道该在什么时候、以什么方式调用它。接下来我们就从最基础的问题开始我的系统现在处于哪个运行级别2. 查看当前系统运行级别runlevel 命令一目了然Linux 系统启动后并不是直接进入图形界面或命令行而是先进入一个预定义的“运行状态”这就是运行级别Runlevel。不同级别代表不同的服务组合比如级别 3 是多用户命令行模式级别 5 是带图形界面的完整桌面环境。查看当前运行级别只需一条命令runlevel执行后你会看到类似这样的输出N 5这表示上一个运行级别是 NNone即系统刚启动无前级当前运行级别是 5。关键点数字 5 意味着系统启动时会自动加载/etc/rc5.d/目录下的所有启动脚本。换句话说如果你希望脚本在图形界面启动完成后才运行就必须确保它出现在/etc/rc5.d/中如果只想在纯命令行下运行则应关注/etc/rc3.d/。那这些rc*.d目录和/etc/init.d/是什么关系一句话说清/etc/init.d/是所有服务脚本的“源仓库”你写的mytest.sh就放在这里/etc/rc5.d/或其他 rc*.d是运行级别 5 的“执行清单”里面没有真实脚本只有一堆指向/etc/init.d/脚本的软链接。它们之间不是复制关系而是“调度关系”——系统启动时只读取rc5.d/下的链接再根据链接去执行init.d/里的真实脚本。3. 进入对应 rc 目录看清启动顺序的本质既然runlevel显示当前是 5那就直接进/etc/rc5.d/看看里面到底有什么cd /etc/rc5.d/ ls -l你大概率会看到一堆以S或K开头的文件例如S10sysklogd S20rsyslog S50apache2 S99mytest K01network这些名字不是随意起的而是有严格含义的S开头表示Start启动系统启动时执行K开头表示Kill停止系统关机或切换级别时执行紧随其后的两位数字如 10、50、99表示执行顺序数字越小越早执行越大越晚。为什么顺序重要举个实际例子你的脚本如果需要访问 MySQL 数据库而 MySQL 服务本身是S20mysql那你自己的脚本就不能叫S10mytest——否则它会在 MySQL 启动前就尝试连接必然失败。合理的做法是命名为S99mytest确保它排在绝大多数基础服务之后执行。注意Ubuntu 16.04 及以后版本默认使用 systemd传统 SysV init 的 rc*.d 机制虽仍兼容但优先级低于 systemd 单元。不过对于快速验证、教学演示或遗留系统维护这套机制依然清晰、可靠、无需额外学习成本。4. 为脚本创建软链接让系统“认出”它现在我们把/etc/init.d/mytest.sh正式加入到运行级别 5 的启动队列中。方法很简单在/etc/rc5.d/下创建一个指向它的软链接。执行这条命令sudo ln -s /etc/init.d/mytest.sh /etc/rc5.d/S99mytest注意命名规则S99表示“启动”序号99表示最后执行稳妥起见避免依赖冲突mytest是链接名建议与脚本名保持一致便于识别。创建完成后再次运行ls -l你应该能看到S99mytest - /etc/init.d/mytest.sh这就完成了最关键的一步系统启动时会按顺序执行S99mytest而它实际调用的就是你写的/etc/init.d/mytest.sh。小技巧如果你希望脚本在多个运行级别都生效比如 2、3、4、5可以分别在/etc/rc2.d/、/etc/rc3.d/等目录下创建对应链接。但对大多数桌面或服务器场景rc5.d已足够覆盖需求。5. 验证效果重启不是唯一方式更安全的测试法很多教程直接说“reboot 测试”但频繁重启既耗时又影响工作。其实我们完全可以在不重启的前提下手动触发一次“启动流程”立即验证脚本是否有效。执行以下命令模拟系统在运行级别 5 下启动该服务sudo /etc/init.d/mytest.sh start然后检查日志cat /var/log/mytest.log你应该看到类似这样的一行Wed Oct 18 14:22:37 CST 2023: mytest.sh started successfully说明脚本本身功能正常权限正确路径无误。接下来才是真正的“启动级验证”我们不重启整机而是临时切换一次运行级别让系统真正走一遍rc5.d的加载流程# 切换到运行级别 3命令行模式 sudo telinit 3 # 再切回 5图形界面模式 sudo telinit 5注意telinit在部分新版 Ubuntu 上可能被systemctl替代若提示命令未找到可改用sudo systemctl isolate multi-user.target对应级别 3和sudo systemctl isolate graphical.target对应级别 5。但原理完全一致强制系统重新加载对应目标级别的所有服务。切换完成后再次查看日志tail -n 1 /var/log/mytest.log如果出现新的时间戳记录恭喜你——你的脚本已经成功嵌入系统启动流程不再是“写好了却没人管”的孤本。6. 常见问题与实用建议避开新手最容易踩的坑即使步骤全对也常因几个细节导致失败。以下是真实环境中高频出现的问题及解决思路问题一脚本写了链接也建了但日志始终为空排查重点检查脚本第一行#!/bin/bash是否存在且正确不能是 Windows 换行符确认/var/log/mytest.log所在目录/var/log/是否可写ls -ld /var/log运行sudo /etc/init.d/mytest.sh start手动测试看是否报错如权限拒绝、路径不存在。问题二runlevel显示N 3但我想在图形界面下运行说明这通常表示你当前处于纯命令行终端如 CtrlAltF2而非图形界面。可执行ps aux | grep lightdm或ps aux | grep gdm3查看图形管理器是否在运行。若未运行可手动启动sudo systemctl start gdm3Ubuntu或sudo systemctl start lightdm。问题三Ubuntu 20.04 上rc5.d似乎没被调用原因新版本默认启用 systemdSysV 兼容层仍在但优先级较低。此时更推荐将脚本转为 systemd 服务单元.service文件但如果你只是想快速验证逻辑rc5.d方式依然有效——只需确保systemd-sysv-generator已启用默认开启它会自动将rc*.d链接映射为 systemd 服务。实用建议命名统一脚本名、链接名、日志名尽量保持一致如mytest避免混淆日志轮转长期使用建议添加 logrotate 配置防止/var/log/mytest.log无限增长退出码检查脚本末尾exit 0很关键非零退出码会被系统视为启动失败可能导致后续服务跳过依赖声明脚本头部的Required-Start注释虽不影响 SysV 执行但在转换为 systemd 时可自动生成依赖关系建议保留。7. 总结运行级别不是黑盒而是可观察、可控制的启动地图到这里你应该已经清楚runlevel命令不是摆设它是打开启动机制的第一把钥匙rc5.d目录不是杂乱的文件夹而是一张精确到秒级的“服务执行时间表”软链接不是技术噱头而是系统识别脚本身份的唯一凭证日志验证比盲目重启更高效、更可控。理解运行级别本质上是在理解 Linux 启动的分阶段治理思想不是所有服务一股脑全开而是按依赖、按角色、按时机有序加载。这种设计让系统既稳定又灵活——你可以随时调整某个脚本的启动顺序而不影响整体结构。下一步你可以尝试把S99mytest改成S10mytest观察它是否真的更早执行在/etc/rc0.d/关机级别下创建K01mytest让它在关机前写一行日志对比 CentOS 7 和 Ubuntu 22.04 的runlevel输出差异思考 init 系统演进的底层逻辑。知识只有在动手验证后才真正属于自己。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询