Linux chkconfig命令详解

chkconfig命令是Red Hat系列Linux发行版中用于管理系统服务启动项的工具,可以查看、修改和配置不同运行级别下的服务启动状态。
注意:chkconfig主要用于使用SysV init系统的Linux发行版(如RHEL 6及以下、CentOS 6及以下)。在现代使用systemd的系统中(如RHEL 7+/CentOS 7+),建议使用systemctl命令。

命令简介

chkconfig 是Red Hat、CentOS、Fedora等Linux发行版中用于管理SysV init系统服务的工具。它允许管理员在不同的运行级别(runlevel)中配置哪些服务在系统启动时自动启动,哪些服务需要手动启动。通过chkconfig,可以方便地管理系统服务的启动状态,确保系统按照需要运行必要的服务。

命令语法

chkconfig [选项] [服务名] [on|off|reset|resetpriorities]

选项说明

选项 说明
--list [服务名] 列出服务的启动状态(如果不指定服务名,则列出所有服务)
--add 服务名 添加一个新的服务到chkconfig管理
--del 服务名 从chkconfig管理中删除一个服务
--level 运行级别 指定要操作的运行级别(可以是单个或多个,如2345)
--override 服务名 覆盖服务的默认配置
--no-redirect 不重定向输出(与--list一起使用时)
--version 显示版本信息
--help 显示帮助信息

运行级别说明

运行级别 描述 典型用途
0 停机(halt) 关闭系统
1 单用户模式(single user mode) 系统恢复、维护
2 多用户模式,无网络(Multiuser, without NFS) 无网络连接的多用户模式
3 完全多用户模式(Full multiuser mode) 标准操作模式,文本界面
4 未使用(User-definable) 可根据需要自定义
5 图形界面模式(X11) 图形登录界面
6 重启(reboot) 重新启动系统

常用操作示例

示例1:列出所有服务的启动状态

chkconfig --list

输出示例:

NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
...

示例2:查看特定服务的启动状态

chkconfig --list sshd

显示sshd服务在不同运行级别的启动状态。

示例3:启用服务在特定运行级别自启动

启用sshd服务在运行级别3、5自启动:

sudo chkconfig --level 35 sshd on

设置sshd在运行级别3和5自动启动。

示例4:禁用服务在所有运行级别的自启动

sudo chkconfig httpd off

禁用httpd服务在所有运行级别的自动启动。

示例5:添加新服务到chkconfig管理

sudo chkconfig --add myservice

将myservice服务添加到chkconfig管理系统中。

示例6:从chkconfig管理中删除服务

sudo chkconfig --del myservice

从chkconfig管理系统中删除myservice服务。

示例7:重置服务启动状态

sudo chkconfig sshd reset

重置sshd服务的启动状态到默认设置。

示例8:设置服务在多个运行级别启动

sudo chkconfig --level 2345 crond on

设置crond服务在运行级别2、3、4、5自动启动。

服务配置文件结构

SysV init服务配置文件位置:

/etc/rc.d/init.d/          # 服务启动脚本目录
/etc/rc.d/rc0.d/           # 运行级别0对应的服务链接目录
/etc/rc.d/rc1.d/           # 运行级别1对应的服务链接目录
/etc/rc.d/rc2.d/           # 运行级别2对应的服务链接目录
/etc/rc.d/rc3.d/           # 运行级别3对应的服务链接目录
/etc/rc.d/rc4.d/           # 运行级别4对应的服务链接目录
/etc/rc.d/rc5.d/           # 运行级别5对应的服务链接目录
/etc/rc.d/rc6.d/           # 运行级别6对应的服务链接目录

服务链接命名规则:

  • S##服务名:启动服务(S表示Start,##表示启动顺序)
  • K##服务名:停止服务(K表示Kill,##表示停止顺序)
  • 例如:S10network表示启动顺序10的network服务

chkconfig vs systemctl 对比

特性 chkconfig (SysV init) systemctl (systemd)
系统版本 RHEL/CentOS 6及以下 RHEL/CentOS 7及以上
命令语法 chkconfig --list
chkconfig sshd on
systemctl list-unit-files
systemctl enable sshd
运行级别 0-6共7个运行级别 使用target(如multi-user.target)
服务状态查看 service sshd status systemctl status sshd
服务管理 service sshd start|stop|restart systemctl start|stop|restart sshd
配置文件 /etc/rc.d/init.d/ /usr/lib/systemd/system/

常用服务管理

服务名称 描述 典型设置
sshd SSH远程登录服务 运行级别3、5启用
httpd Apache Web服务器 运行级别3、5启用
mysqld MySQL数据库服务 运行级别3、5启用
crond 定时任务服务 所有运行级别启用(2-5)
network 网络服务 运行级别2、3、4、5启用
iptables 防火墙服务 运行级别3、5启用
auditd 审计服务 运行级别3、5启用
syslog 系统日志服务 所有运行级别启用(2-5)

创建自定义服务

创建自定义服务的步骤:

  1. 创建服务启动脚本到/etc/rc.d/init.d/
  2. 添加chkconfig配置行到脚本中
  3. 设置脚本可执行权限
  4. 使用chkconfig添加服务

示例服务脚本:

#!/bin/bash
# /etc/rc.d/init.d/myservice
# chkconfig: 2345 90 10
# description: My custom service

# 服务管理逻辑
case "$1" in
    start)
        echo "Starting myservice..."
        # 启动命令
        ;;
    stop)
        echo "Stopping myservice..."
        # 停止命令
        ;;
    restart)
        echo "Restarting myservice..."
        $0 stop
        $0 start
        ;;
    status)
        echo "Checking myservice status..."
        # 状态检查命令
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0

关键配置行说明:

  • # chkconfig: 2345 90 10:表示在运行级别2、3、4、5启动,启动顺序90,停止顺序10
  • # description: My custom service:服务描述信息

添加服务到chkconfig:

# 设置脚本权限
sudo chmod +x /etc/rc.d/init.d/myservice

# 添加服务到chkconfig管理
sudo chkconfig --add myservice

# 启用服务
sudo chkconfig myservice on

# 验证服务状态
sudo chkconfig --list myservice

注意事项

重要提示:
  1. 系统兼容性:chkconfig主要用于SysV init系统,现代systemd系统使用systemctl
  2. 权限要求:大多数chkconfig操作需要root权限
  3. 服务依赖性:修改服务启动状态时需要考虑服务间的依赖关系
  4. 立即生效:chkconfig只修改启动配置,不立即启动或停止服务
  5. 配置文件:服务脚本必须包含chkconfig配置行才能被正确管理
  6. 启动顺序:服务的启动顺序由S后面的数字决定,数字越小启动越早
  7. 系统升级:系统升级到systemd后,需要迁移服务管理方式
  8. 测试验证:修改关键服务配置前,建议在测试环境验证
实用技巧
  • 查看所有启用的服务:chkconfig --list | grep ":on"
  • 查看特定运行级别的服务:ls /etc/rc.d/rc3.d/
  • 手动启动服务:service 服务名 start/etc/init.d/服务名 start
  • 检查服务是否正在运行:ps aux | grep 服务名netstat -tulpn | grep 端口
  • 备份服务配置:cp -r /etc/rc.d/init.d/ /backup/init.d_backup
  • 查看服务启动日志:tail -f /var/log/boot.log
  • 安装chkconfig(如果未安装):sudo yum install chkconfig(RHEL/CentOS)
  • 查看服务依赖关系:检查服务脚本中的Required-Start和Should-Start字段

故障排除

常见问题及解决方法:
  1. "service 服务名 does not support chkconfig":服务脚本缺少chkconfig配置行,添加配置行并重新添加服务
  2. 服务启动失败:检查服务脚本权限和语法,查看系统日志/var/log/messages
  3. 修改后不生效:chkconfig只管理启动配置,需要重启系统或手动启动服务
  4. 服务冲突:两个服务使用相同端口,修改端口配置或禁用其中一个服务
  5. 启动顺序问题:调整S后面的数字改变启动顺序
  6. 服务不存在:确保服务脚本在/etc/rc.d/init.d/目录中
  7. 权限拒绝:使用sudo或以root用户身份执行命令
  8. 依赖服务未启动:确保依赖的服务已启用并启动

systemd系统中的替代方法

在systemd系统中管理服务的对应命令:

# 查看服务状态(对应chkconfig --list)
systemctl list-unit-files --type=service

# 启用服务自启动(对应chkconfig 服务名 on)
systemctl enable 服务名

# 禁用服务自启动(对应chkconfig 服务名 off)
systemctl disable 服务名

# 查看服务是否启用(对应chkconfig --list 服务名)
systemctl is-enabled 服务名

# 启动服务(对应service 服务名 start)
systemctl start 服务名

# 停止服务(对应service 服务名 stop)
systemctl stop 服务名

# 重启服务(对应service 服务名 restart)
systemctl restart 服务名

# 查看服务状态(对应service 服务名 status)
systemctl status 服务名

转换注意事项:在从SysV init迁移到systemd时,原有服务通常会自动兼容,但自定义服务可能需要创建systemd服务单元文件。

实际应用案例

案例:配置Web服务器环境
  1. 安装必要服务:
    sudo yum install httpd mysql-server php
  2. 配置服务自启动:
    # 启用Apache
    sudo chkconfig --level 235 httpd on
    
    # 启用MySQL
    sudo chkconfig --level 235 mysqld on
    
    # 验证配置
    sudo chkconfig --list httpd
    sudo chkconfig --list mysqld
  3. 启动服务:
    sudo service httpd start
    sudo service mysqld start
  4. 配置防火墙:
    # 启用防火墙
    sudo chkconfig --level 235 iptables on
    
    # 添加HTTP端口例外
    sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
    sudo service iptables save
  5. 重启系统验证:
    sudo reboot
    
    # 重启后检查服务状态
    service httpd status
    service mysqld status
    netstat -tulpn | grep :80