Linux系统中服务管理是运维工作的基础内容,systemctl、service和chkconfig都是用于服务管理的命令,但三者的设计背景、适用场景和功能范围存在明显不同,理解这些差异能帮助用户更高效地完成服务相关操作。

适用系统版本差异
三个命令最直观的区别是适用的Linux初始化系统不同:
- chkconfig:仅适用于使用SysVinit初始化系统的Linux发行版,比如CentOS 6及更早版本、部分老版本的Ubuntu系统。
- service:同样主要适配SysVinit系统,在SysVinit系统中用于临时管理服务状态,不负责开机自启配置。
- systemctl:是Systemd初始化系统的配套命令,适用于所有使用Systemd的Linux发行版,比如CentOS 7及以上版本、Ubuntu 16.04及以上版本、Debian 8及以上版本。
核心功能定位区别
三个命令的功能覆盖范围有明显层级差异:
| 命令 | 核心功能 | 功能范围 |
|---|---|---|
| chkconfig | 配置服务的开机自启状态 | 仅能管理服务的开机启动/关闭,无法临时启停服务 |
| service | 临时管理服务的运行状态 | 仅能临时启停、重启、查看服务状态,无法配置开机自启 |
| systemctl | 全功能服务管理 | 同时支持临时服务状态管理和开机自启配置,还支持查看服务依赖、日志等扩展功能 |
常用操作对比
服务状态查看
查看nginx服务的运行状态,三个命令的使用方式如下:
chkconfig不支持查看服务运行状态,仅能查看开机自启配置:
# 仅适用于SysVinit系统,查看nginx开机自启状态 chkconfig --list nginx
service命令查看服务运行状态:
# 适用于SysVinit系统,查看nginx运行状态 service nginx status
systemctl命令查看服务运行状态:
# 适用于Systemd系统,查看nginx运行状态 systemctl status nginx
服务启停操作
临时启动nginx服务:
chkconfig无此功能,无法执行启停操作。
service命令启动服务:
# 适用于SysVinit系统,启动nginx service nginx start # 停止nginx service nginx stop # 重启nginx service nginx restart
systemctl命令启动服务:
# 适用于Systemd系统,启动nginx systemctl start nginx # 停止nginx systemctl stop nginx # 重启nginx systemctl restart nginx # 重载nginx配置 systemctl reload nginx
开机自启配置
配置nginx开机自动启动:
service命令无此功能,无法配置开机自启。
chkconfig命令配置开机自启:
# 适用于SysVinit系统,设置nginx开机自启 chkconfig nginx on # 关闭nginx开机自启 chkconfig nginx off
systemctl命令配置开机自启:
# 适用于Systemd系统,设置nginx开机自启 systemctl enable nginx # 关闭nginx开机自启 systemctl disable nginx # 查看nginx是否开机自启 systemctl is-enabled nginx
底层机制差异
三个命令的底层依赖的服务配置方式完全不同:
- chkconfig和service依赖
/etc/init.d/目录下的服务脚本,每个服务对应一个独立的脚本文件,脚本需要遵循SysVinit的规范编写,包含start、stop、restart、status等函数。 - systemctl依赖
/usr/lib/systemd/system/目录下的单元配置文件,文件后缀为.service,采用声明式的配置方式,不需要编写复杂的脚本逻辑,配置更简洁规范。
兼容情况说明
在Systemd系统中,为了兼容老的使用习惯,通常也支持service和chkconfig命令的语法,但本质是systemctl的兼容封装,执行效果和执行对应的systemctl命令一致。比如执行service nginx start,实际会调用systemctl start nginx。但反过来,在SysVinit系统中无法使用systemctl命令,因为系统没有运行Systemd进程。
使用建议
如果是维护CentOS 6及更早版本的老系统,使用service管理服务状态,chkconfig管理开机自启;如果是维护CentOS 7及以上版本、Ubuntu 16.04及以上版本的新系统,直接使用systemctl完成所有服务管理操作,功能更完善,操作也更统一。如果不确定系统使用的初始化系统,可以执行ps -p 1 -o comm=命令查看,输出为init则是SysVinit系统,输出为systemd则是Systemd系统。