S99test软链接怎么建?测试脚本操作全过程
你是不是也遇到过这样的问题:写好了开机启动脚本,却卡在最后一步——软链接怎么建?尤其是那个看起来很神秘的S99test,99到底代表什么?为什么非得是S开头?能不能改成K?重启后脚本为啥没执行?别急,这篇文章不讲抽象概念,不堆术语,就用最直白的方式,带你从零完成整个流程。无论你是刚接触Linux的新手,还是临时需要验证脚本的老手,都能照着一步步操作,亲眼看到脚本在系统启动时自动跑起来。
我们用的是预置镜像“测试开机启动脚本”,它已经为你准备好基础环境,省去系统差异带来的干扰。整个过程在CentOS和Ubuntu上完全通用,不需要额外安装任何工具,也不用改配置文件权限(除非你主动动过)。下面我们就从最开始的准备说起。
1. 确认你的脚本已就位
在开始建软链接前,先确保你的测试脚本真的存在、可执行,并且位置正确。
你的脚本必须放在/etc/init.d/目录下,这是传统SysV init系统约定的“服务脚本存放地”。假设你的脚本名叫mytest.sh,那么它的完整路径就是:
/etc/init.d/mytest.sh你可以用下面这条命令快速检查它是否存在:
ls -l /etc/init.d/mytest.sh如果看到类似这样的输出,说明脚本已就位:
-rwxr-xr-x 1 root root 234 Jan 15 10:20 /etc/init.d/mytest.sh注意看最前面的-rwxr-xr-x—— 这表示它有执行权限(x)。如果没有x,脚本建了也运行不了。补救方法很简单:
sudo chmod +x /etc/init.d/mytest.sh如果你还没写这个脚本,这里提供一个最小可用版本,复制粘贴保存即可(记得用root权限):
#!/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 test script for boot sequence ### END INIT INFO case "$1" in start) echo "mytest.sh started at $(date)" >> /var/log/mytest.log ;; stop) echo "mytest.sh stopped at $(date)" >> /var/log/mytest.log ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0把它保存为/etc/init.d/mytest.sh,再执行sudo chmod +x /etc/init.d/mytest.sh,就齐活了。
2. 查清系统当前运行级别
软链接不是随便往哪个rcX.d目录里一扔就行的,它必须放进系统实际使用的那个启动级别目录里。而这个级别,由系统当前的“运行级别”(runlevel)决定。
别被名字吓到,它其实就是一个数字,代表系统当前处于哪种工作状态。开机自启脚本,只会在系统进入多用户图形或命令行界面时加载,对应的就是 runlevel 2、3、4 或 5。
执行这行命令,立刻知道答案:
runlevel你会看到类似这样的输出:
N 5这表示:系统刚启动(N),现在运行在级别 5。绝大多数带桌面的Ubuntu和CentOS默认就是5;纯服务器环境常用3。重点来了:你看到的第二个数字,就是你要进的目录名。
所以,如果输出是N 5,你就进/etc/rc5.d/;如果是N 3,就进/etc/rc3.d/。这个数字决定了脚本何时被调用。
小知识卡片
/etc/init.d/是所有服务脚本的“老家”,统一存放;/etc/rcX.d/(X是数字)则是“调度室”,里面全是软链接,告诉系统:“在X级别启动时,按顺序执行哪些脚本”。
它们不是两个独立系统,而是一套分工明确的协作机制。
3. 进入正确的rcX.d目录
确认了运行级别是5,那就直接切换过去:
cd /etc/rc5.d/然后列出当前目录内容:
ls -l你会看到一堆以S或K开头的文件,比如S10sysklogd、S20ssh、K90network……它们全都是指向/etc/init.d/下真实脚本的软链接。
这些名字不是随意起的,而是有严格格式:[SK][两位数字][服务名]。
S表示 Start(启动时执行)K表示 Kill(关机或切换级别时执行)- 两位数字(00–99)代表执行顺序,数字越小越早执行,越大越晚
- 后面的名字只是个标识,方便人看,不影响功能
所以S99test的含义就很清楚了:这是一个用于启动的脚本链接,序号是99,名字叫test。它会在所有S00到S98的脚本之后执行。
为什么推荐99?
因为你的测试脚本大概率不依赖其他复杂服务(比如数据库、网络服务)。但如果你的脚本要读取网络配置、连接远程API,那最好把序号设大一点(比如95以上),确保它在网卡、DNS等基础服务就绪后再运行。99是安全的“压轴位”。
4. 创建S99test软链接
这才是本文的核心动作。命令只有一行,但每个参数都值得细说:
sudo ln -s /etc/init.d/mytest.sh S99test逐个拆解:
sudo:必须用root权限,否则没权限在系统目录下创建文件ln -s:ln是创建链接的命令,-s表示“软链接”(symbolic link),不是硬链接/etc/init.d/mytest.sh:这是“源文件”,即你真正写的脚本,必须写绝对路径S99test:这是“链接名”,会出现在当前目录(/etc/rc5.d/)下,名字必须以S或K开头,否则系统不会识别为启动项
执行完后,再用ls -l看一眼:
ls -l S99test你应该看到:
S99test -> /etc/init.d/mytest.sh箭头->就是软链接的标志,说明它成功指向了你的脚本。
常见错误提醒
错误1:写成ln -s S99test /etc/init.d/mytest.sh(源和目标颠倒)
错误2:漏掉sudo,提示 Permission denied
错误3:在/etc/rc5.d/外执行命令,链接建到了错误位置
正确姿势:先cd /etc/rc5.d/,再sudo ln -s /etc/init.d/mytest.sh S99test
5. 验证链接是否生效
建完链接不等于万事大吉。我们得验证两件事:
第一,系统能否识别它为合法启动项;
第二,它是否真能在开机时运行。
5.1 检查启动项注册状态
很多系统提供了chkconfig(CentOS)或update-rc.d(Ubuntu)这类工具来管理启动项。虽然我们手动建了链接,但用工具检查更直观:
在CentOS上运行:
sudo chkconfig --list | grep mytest如果看到
mytest 0:off 1:off 2:on 3:on 4:on 5:on 6:off,说明已在2/3/4/5级启用。在Ubuntu上运行:
sudo update-rc.d mytest defaults这条命令会自动为你生成标准的
S和K链接(如果你之前没手动建,它会建;如果已存在,它会跳过)。它本身不破坏你已建的S99test,反而是个双重保险。
5.2 手动触发一次,看日志有没有记录
不用等重启,我们可以立刻模拟一次启动过程:
sudo /etc/init.d/mytest.sh start然后检查日志:
cat /var/log/mytest.log如果看到类似mytest.sh started at Mon Jan 15 10:25:33 CST 2024的记录,恭喜,脚本本身没问题,执行逻辑通了。
6. 最终测试:重启并确认
前面所有步骤都是铺垫,真正的验收时刻来了——重启。
执行:
sudo reboot等待系统完全重启、登录进去后,第一时间检查日志:
cat /var/log/mytest.log你应当看到至少两条记录:一条是上次手动执行的,另一条是本次开机自动触发的,时间戳明显是重启后的新时间。
如果只有一条,或者日志为空,说明软链接没生效。这时请按顺序排查:
runlevel输出是否仍是5?如果不是,你可能进了错的rcX.d目录ls -l /etc/rc5.d/S99test是否显示正确指向?箭头是否消失?/etc/init.d/mytest.sh是否仍有执行权限?ls -l看看有没有x- 日志路径
/var/log/mytest.log所在目录是否有写入权限?(一般/var/log是root可写,没问题)
只要每一步都按本文操作,99%的情况都能一次成功。
7. 进阶提示:不只是S99test
你可能已经发现,S99test只是一个命名习惯,不是强制规则。理解了原理,你就能灵活应对各种需求:
7.1 想让它关机时也执行?
那就再建一个K01test,指向同一个脚本:
sudo ln -s /etc/init.d/mytest.sh /etc/rc0.d/K01test sudo ln -s /etc/init.d/mytest.sh /etc/rc6.d/K01testrc0.d对应关机,rc6.d对应重启。K01表示它是最早被停止的服务之一。
7.2 想换名字,比如叫S99mystart?
完全可以。只要保持S+ 数字 + 名字的格式,系统就认:
sudo ln -s /etc/init.d/mytest.sh S99mystart名字只是给人看的,系统只关心S和数字。
7.3 Ubuntu新系统用systemd怎么办?
本文镜像基于传统SysV init,所以rcX.d方式完全适用。但如果你在较新Ubuntu(16.04+)或CentOS 7+上操作,底层已是systemd。此时rcX.d仍被兼容支持,但更推荐写.service文件。这不是本文范围,但可以告诉你:S99test在新系统里依然有效,无需改动。
总结
到这里,你应该已经彻底搞懂S99test软链接是怎么回事了。它不是魔法,也不是黑箱,而是一套清晰、稳定、沿用几十年的Linux启动机制。我们梳理一下关键点:
- 脚本必须放
/etc/init.d/,且有执行权限 runlevel命令告诉你该进/etc/rcX.d/中的哪一个S开头表示启动时执行,K表示停止时执行,数字决定先后顺序ln -s 源文件 链接名是唯一命令,顺序不能错,必须用绝对路径- 重启不是唯一验证方式,
start手动触发 + 查日志更快定位问题
你不需要记住所有细节,只需要记住这个心法:链接是桥梁,rcX.d是路口,S/K+数字是通行牌号,而你的脚本,永远安静地待在/etc/init.d/这个起点站。
现在,关掉这篇教程,打开终端,亲手敲一遍ln -s。当你在日志里看到那行属于你自己的启动记录时,那种掌控感,比任何理论都来得实在。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。