linux中service和systemctl分属sysv init与systemd两套独立初始化系统,前者依赖/etc/init.d/脚本,后者操作unit文件;systemctl具备状态解耦、日志集成、依赖管理等原生能力,现代发行版已默认采用。

Linux 里 service 和 systemctl 看似都能启停服务,但本质是两套不同年代、不同设计哲学的系统在共存。关键不在“哪个更好用”,而在于“你用的是什么初始化系统”——它决定了命令背后的执行逻辑、状态持久性、依赖处理能力,甚至排错效率。
底层归属完全不同
service 属于传统 SysV init 体系,只认 /etc/init.d/ 下的 shell 脚本;systemctl 是 systemd 的原生命令,操作对象是 /lib/systemd/system/ 或 /etc/systemd/system/ 中的 unit 文件(如 nginx.service)。两者不是新旧版本关系,而是两个独立初始化系统的控制接口。
开机自启机制不可互换
service 命令本身不管理开机启动。它要靠配套工具:
– debian/ubuntu 用 update-rc.d
– RHEL/centos 6 用 chkconfig
这些工具修改的是 runlevel 目录下的符号链接,与当前服务是否运行无关。
systemctl 的 enable 和 disable 则直接在 /etc/systemd/system/ 创建或删除软链接,决定 unit 是否被 target(如 multi-user.target)拉起,设置与运行时状态解耦,语义清晰、可审计。
状态查看和故障定位能力差距明显
执行 service nginx status:只是调用脚本里的 status 函数,输出常为一行“running”或“not running”,无上下文,不带日志,失败原因藏在别处。
执行 systemctl status nginx:展示激活状态(active/inactive)、子进程树、最近 10 行 journal 日志、启动耗时、CGroup 资源使用、上一次失败的完整堆栈。一次命令就能判断是配置错、端口占、权限问题还是依赖未就绪。
现代发行版中 systemctl 是事实标准
Ubuntu 16.04+、CentOS/RHEL 7+、Debian 8+、Fedora 全系等均已默认启用 systemd。此时 service 命令实际是 systemd 提供的兼容封装——它会尝试把请求转给 systemctl 执行,但绕过 unit 定义、忽略依赖声明、不写入 journal,行为不可控且语义模糊。
- 查初始化系统类型:运行
ps -p 1 -o comm=,输出systemd就该用 systemctl - 服务名可省略
.service后缀,但显式写出(如systemctl start sshd.service)更利于脚本可读性和跨环境迁移 - 不要混用:用
systemctl enable设置了开机自启,就别再靠service xxx start临时启动——后者不会触发 unit 的完整生命周期流程