理解 Linux 运行级别与启动项
Linux 系统定义了 7 个运行级别(Runlevel),用于控制不同状态下系统启动的服务:
- 0:关机
- 1:单用户模式(救援模式)
- 2:多用户模式,无网络(通常未使用)
- 3:完整的多用户文本模式(服务器常用)
- 4:保留,通常未使用
- 5:图形界面模式(桌面常用)
- 6:重启
要查看所有服务在各个运行级别的启动状态,可以使用 chkconfig --list 命令。
使用 chkconfig 管理服务启动状态
chkconfig 是 CentOS/RHEL 6 及之前版本管理 SysV init 服务的主要工具。其基本语法如下:
# 查看服务状态
chkconfig --list [服务名]
# 设置服务在指定运行级别开启或关闭
chkconfig --level [级别列表] [服务名] {on|off}
# 添加或删除服务管理
chkconfig --add [服务名]
chkconfig --del [服务名]
示例:管理 SSH 服务
例如,要在运行级别 3 和 5 关闭 sshd 服务,可以执行:
chkconfig --level 35 sshd off
要查看修改后的状态:
chkconfig --list sshd
手动管理启动脚本目录
除了使用 chkconfig,你也可以直接操作 /etc/rc.d/ 目录下的文件来管理启动项。
# 查看 /etc/rc.d/ 目录结构
ls /etc/rc.d/
# 输出示例(CentOS 6):
# init.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
init.d/:存放所有服务的启动脚本。rcN.d/(N=0~6):对应各个运行级别的符号链接目录。rc.local:系统最后执行的自定义启动脚本。rc.sysinit:系统初始化脚本。
解读 rcN.d 目录中的文件
以 rc3.d/(运行级别 3)为例:
ls /etc/rc.d/rc3.d/
# 示例输出:
# K02avahi-dnsconfd S25bluetooth
# K02NetworkManager S25netfs
# S04readahead_early S26apmd
- K 开头:进入该运行级别时需要停止的服务。数字代表执行顺序。
- S 开头:进入该运行级别时需要启动的服务。数字代表执行顺序。
重要规则:系统会先按数字顺序执行所有 K(Kill)脚本,再按顺序执行所有 S(Start)脚本。因此,S 脚本的启动命令会覆盖 K 脚本的停止命令(如果针对同一服务)。
设置程序开机自启动的常用方法
假设你需要让 vncserver 在系统启动后自动运行,以下是几种实现方法。
方法一:将程序注册为系统服务(推荐)
这是最规范的方法,适用于长期运行的后台程序。
-
检查服务状态:
chkconfig --list | grep vnc -
设置开机启动(例如在运行级别 5):
chkconfig --level 5 vncserver on -
验证设置:
chkconfig --list | grep vnc # 输出应显示:vncserver 0:off ... 5:on 6:off
方法二:使用 /etc/rc.local 脚本
/etc/rc.local 是系统在所有初始化脚本执行完毕后最后运行的脚本。适合添加简单的启动命令。
# 编辑 rc.local 文件
vi /etc/rc.local
# 在文件末尾(exit 0 之前)添加你的命令,例如:
/usr/bin/vncserver :1
# 确保 rc.local 有可执行权限
chmod +x /etc/rc.local
方法三:创建自定义 Systemd 服务(CentOS/RHEL 7+)
注意:CentOS/RHEL 7 及以上版本使用 systemd 替代了 SysV init。管理命令已更新:
# 查看服务状态
systemctl status [服务名]
# 设置开机启动
systemctl enable [服务名]
# 立即启动服务
systemctl start [服务名]
# 查看所有已启用的服务
systemctl list-unit-files --type=service | grep enabled
对于自定义程序,你需要创建一个 .service 文件在 /etc/systemd/system/ 目录下。
重要区别与联系
- Linux 服务:由 init 系统(SysV init 或 systemd)管理的后台守护进程,具有完整的生命周期控制(启动、停止、重启、状态查看)。
- 开机自启动:是服务的一个属性。一个服务可以被设置为开机自启动,但并非所有开机自运行的命令都是标准的“服务”。
- 关键脚本文件:
/etc/rc.local:用于用户自定义命令。/etc/inittab(旧版):定义默认运行级别和某些终端。/etc/profile与~/.bash_profile:用户登录时执行的 Shell 环境配置脚本,不应用于启动后台服务。
总结与最佳实践
- 优先使用服务管理工具:对于标准服务,始终使用
chkconfig(CentOS 6)或systemctl(CentOS 7+)进行管理。 - 使用 rc.local 作为补充:对于无法或不便封装成服务的简单脚本或命令,可放入
/etc/rc.local。 - 注意权限:确保启动脚本和命令具有正确的执行权限。
- 明确运行级别:服务器环境通常使用运行级别 3(无图形界面),桌面环境使用运行级别 5。
- 版本适配:CentOS/RHEL 7 开始已全面转向 systemd,请使用对应的
systemctl命令进行服务管理。