service 命令是用于运行 System V init 脚本的传统工具,在较新的 Ubuntu 版本(如 15.04 及以后)中,系统已经从 sysvinit 迁移到了 systemd,service 命令的行为和推荐用法也发生了一些变化。

service 命令是什么?
service 命令是一个统一的接口,用于控制系统服务,它允许你启动、停止、重启和检查一个服务的状态,而无需知道该服务的启动脚本具体存放在哪个位置(/etc/init.d/)。
在 systemd 时代,service 命令实际上是一个指向 systemctl 的“前端”或“兼容层”。
基本语法
service <服务名> <操作>
<服务名>: 你要控制的服务的名称。apache2,nginx,ssh,ufw。<操作>: 你要对服务执行的操作,常用操作包括:start: 启动服务。stop: 停止服务。restart: 重启服务(先停止,再启动)。reload: 重新加载服务的配置文件,而不中断服务进程(如果服务支持此操作)。status: 查看服务的当前状态。force-reload: 强制重新加载配置,类似于restart,但会尽量保持连接。status --full或status --no-pager: 查看更详细的状态信息。
常用示例
示例 1:启动、停止和重启服务
假设你要管理 Apache Web 服务器。
# 启动 apache2 服务 sudo service apache2 start # 查看 apache2 服务的状态 sudo service apache2 status # 输出示例: # ● apache2.service - The Apache HTTP Server # Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) # Active: active (running) since ... # Docs: https://httpd.apache.org/docs/2.4/ # Process: ... # Main PID: ... (apache2) # Tasks: ... (limit: ...) # Memory: ... # CGroup: /system.slice/apache2.service # ├─... /usr/sbin/apache2 -k start # ... # 停止 apache2 服务 sudo service apache2 stop # 再次查看状态,应该显示 "inactive (dead)" sudo service apache2 status # 重启 apache2 服务 sudo service apache2 restart
示例 2:重新加载配置
当你修改了服务的配置文件(如 Apache 的 apache2.conf),而不是重启整个服务,可以使用 reload 来让服务应用新配置。

# 修改了配置文件后,重新加载 apache2 sudo service apache2 reload
示例 3:查看所有可用的服务
虽然 service 命令本身不带列出所有服务的选项,但你可以通过列出 /etc/init.d/ 目录下的脚本来找到传统的 SysV 服务。
# 列出所有 SysV init 脚本(服务) ls /etc/init.d/
对于 systemd 服务,你应该使用 systemctl 命令。
重要提醒:service vs systemctl
在 Ubuntu 16.04 及更新的版本中,强烈推荐使用 systemctl 命令来管理服务,因为它是 systemd 的原生工具,功能更强大、信息更详细。
systemctl 命令对比
| 功能 | service 命令 |
systemctl 命令 |
说明 |
|---|---|---|---|
| 启动服务 | sudo service nginx start |
sudo systemctl start nginx |
systemctl 是标准方式 |
| 停止服务 | sudo service nginx stop |
sudo systemctl stop nginx |
systemctl 是标准方式 |
| 重启服务 | sudo service nginx restart |
sudo systemctl restart nginx |
systemctl 是标准方式 |
| 重载配置 | sudo service nginx reload |
sudo systemctl reload nginx |
systemctl 是标准方式 |
| 查看状态 | sudo service nginx status |
sudo systemctl status nginx |
systemctl 提供更丰富的输出 |
| 启用开机自启 | (无直接对应) | sudo systemctl enable nginx |
systemctl 独有功能 |
| 禁用开机自启 | (无直接对应) | sudo systemctl disable nginx |
systemctl 独有功能 |
| 查看所有服务 | ls /etc/init.d/ |
sudo systemctl list-units --type=service |
systemctl 功能更强大 |
| 查看服务详情 | (无直接对应) | sudo systemctl status nginx |
显示进程、日志等详细信息 |
为什么推荐 systemctl?
- 功能更全面:
systemctl可以管理服务的“启用/禁用”(开机自启),而service命令不行。 - 信息更丰富:
systemctl status不仅显示服务是否运行,还会显示其Unit File的位置、主进程 ID、最近的日志条目等,这对于排查问题非常有帮助。 - 是未来标准:
systemd已经成为现代 Linux 发行版(包括 Ubuntu, CentOS, Debian, Fedora 等)的初始化系统标准。service命令只是为了向后兼容而保留的。
常见错误及解决方法
错误 1:Failed to start service.service: Unit service.service not found
这个错误通常意味着你使用的服务名不正确,或者该服务不是通过 systemd 或 SysV 管理的。

解决方法:
- 检查服务名:使用
systemctl列出所有服务,找到正确的名称。systemctl list-units --type=service --all | grep -i "关键词"
查找与网络相关的服务:
systemctl list-units --type=service --all | grep network
- 检查服务是否存在:对于 SysV 服务,检查
/etc/init.d/目录。ls /etc/init.d/ | grep "关键词"
错误 2:/etc/init.d/service: unrecognized service
这表示在 /etc/init.d/ 目录下找不到对应的脚本,或者该脚本已经过时。
解决方法:
这通常意味着该服务已经被 systemd 服务取代,你应该使用 systemctl 来管理它,并忘记 /etc/init.d/ 下的旧脚本。
| 特性 | service 命令 |
systemctl 命令 |
|---|---|---|
| 系统 | 主要用于 SysVinit,systemd 下的兼容层 |
systemd 的原生工具 |
| 功能 | 基本的控制(启、停、重、查) | 功能全面,包括启停、重载、状态、启用/禁用、依赖管理等 |
| 推荐度 | 不推荐,仅用于兼容旧脚本 | 强烈推荐,是现代 Ubuntu 的标准 |
| 示例 | sudo service nginx start |
sudo systemctl start nginx |
最佳实践:
- 对于日常管理,请始终使用
systemctl。 - 当你在网上找到的旧教程使用
service命令时,可以放心地用systemctl替换它。 - 只有当你确定某个服务只存在于
/etc/init.d/并且没有被systemd单元文件接管时,才考虑使用service命令,这种情况在现代 Ubuntu 中已经非常罕见了。
