如何列出 Linux 上正在运行的服务:适用于各种 init 系统的完整指南

LightNode
LightNode - · 更新于 2026-07-06

快速解答:如何列出 Linux 上正在运行的服务

要在 Linux 上列出正在运行的服务,请根据你所用的 init 系统,选用下面的命令之一:

  • systemd(Ubuntu 24.04、Debian 12、CentOS/RHEL 9、Fedora 40+,以及 2026 年绝大多数现代发行版):
    systemctl list-units --type=service --state=running
    
    或者,不管状态如何,列出所有服务单元:
    systemctl --type=service
    
  • SysVinit / 较旧的系统(或想连传统 init 脚本一并纳入时):
    service --status-all
    

如今,systemd 几乎是所有主流 Linux 发行版的默认 init 系统,所以在绝大多数情况下,systemctl list-units --type=service --state=running 就是答案。它会打印出一张当前处于活动状态的服务表,列出各自的 LOADACTIVESUB 状态。如果提示找不到 systemctl,说明你的系统没有运行 systemd——请改用 service --status-all(SysVinit)或 rc-status(OpenRC)。

本指南后续会详细介绍每种方法,包括按状态筛选、查看开机自启的服务,以及按端口查找服务。

引言

Linux 服务是持续运行的后台进程,负责执行各类系统任务,比如管理网络、处理用户登录、运行 Web 服务器等。这些服务可以通过多种工具来管理,具体取决于所用的 Linux 发行版和 init 系统。截至 2026 年,systemd 已是几乎所有主流发行版的标准 init 系统,因此本指南的大部分内容都围绕 systemctl 命令展开。

会列出正在运行的服务,对系统管理员和开发者来说是一项必备技能。它能帮你:

  • 排查故障 —— 确认某个关键服务是在运行还是已经出错。
  • 监控性能 —— 找出占用资源较多的服务。
  • 安全审计 —— 确保只有必要的服务处于活动状态。

使用 systemctl(适用于基于 systemd 的系统)

大多数现代 Linux 发行版都以 systemd 作为 init 系统,其中就包括 2026 年当前的各个版本,例如 Ubuntu(16.04 到 24.04 LTS 及更新版本)、Debian(8 到 12 "Bookworm" 及更新版本)、Fedora(40+)、CentOS Stream / RHEL / Rocky Linux / AlmaLinux(7 到 9 及更新版本)以及 openSUSE。在所有这些系统上,systemctl 都是管理和列出服务的主要工具。

查看单个服务的状态

要确认某个具体服务是否在运行,请使用:

systemctl status <service-name>

例如,想查看 nginx Web 服务器是否在运行:

systemctl status nginx

输出会显示该服务是活动(运行中)未活动还是失败,并附带便于调试的日志。

列出所有活动的服务

要列出所有正在运行的服务,请使用:

systemctl list-units --type=service --state=running

这条命令会以表格形式显示当前所有正在运行的服务及其状态。

列出所有服务(含未活动的)

如果你想查看所有服务,不管它们是否在运行:

systemctl list-units --type=service

这会一并列出处于活动未活动失败或其他状态的服务。

按状态筛选服务

你可以按服务的状态进行筛选:

systemctl list-units --type=service --state=failed

这样只会列出失败的服务,排查故障时特别有用。

列出开机自启的服务

要查看哪些服务被设置为开机时自动启动:

systemctl list-unit-files --type=service | grep enabled

输出示例

systemctl list-units --type=service --state=running 的典型输出大致如下:

UNIT                        LOAD   ACTIVE SUB     DESCRIPTION
cron.service                loaded active running Regular background program processing daemon
networking.service          loaded active running Raise network interfaces
ssh.service                 loaded active running OpenBSD Secure Shell server
systemd-logind.service      loaded active running Login Service

小结

  • systemctl status <service> 查看单个服务的状态。
  • systemctl list-units --type=service --state=running 列出活动的服务。
  • systemctl list-units --type=service 查看所有服务。
  • systemctl list-unit-files --type=service 查看开机自启的服务。

使用 ps 和 grep 查看运行中的进程

如果你不想依赖 systemctl 或其他服务管理工具来列出运行中的服务,可以用 **ps(process status,进程状态)**配合 grep 来查找特定进程。

这种方法在以下场景很有用:

  • 你用的是一套精简的 Linux 系统,没有 systemctlservice 命令。
  • 你只想确认某个进程是否在运行,而不关心底层是哪种 init 系统。

列出所有运行中的进程

ps aux 命令会显示系统上所有正在运行的进程:

ps aux

它会输出一份完整的进程列表,包含各进程的进程 ID(PID)、CPU 占用、内存占用和命令名称。

查找特定服务

要确认某个服务是否在运行,请使用 ps aux | grep <service-name>:

ps aux | grep nginx

这会输出所有包含 "nginx" 的行,从而看出它是否在运行。输出大致如下:

root      1034  0.0  0.3  49536  3412 ?        Ss   12:34   0:00 nginx: master process /usr/sbin/nginx
www-data  1035  0.0  0.2  49536  2824 ?        S    12:34   0:00 nginx: worker process
user      2045  0.0  0.0  14856   900 pts/0    S+   12:35   0:00 grep --color=auto nginx

其中:

  • 前两行表明 nginx 服务正在运行。
  • 最后一行(grep --color=auto nginx)其实是 grep 命令本身。你可以用下面的方式把它排除掉:
ps aux | grep nginx | grep -v grep

以层级结构显示进程

想看得更有条理,可以使用:

ps fax

它会以树状结构显示正在运行的进程,让你更容易看清哪些服务在运行,以及它们各自的子进程。

按端口查找服务

如果你怀疑某个服务运行在特定端口上,却不确定它的服务名,可以使用:

netstat -tulnp | grep :80

或者,如果没有 netstat:

ss -tulnp | grep :80

这会列出占用 80 端口的进程(该端口通常被 Nginx、Apache 等 Web 服务器使用)。

小结

  • ps aux 列出所有正在运行的进程。
  • ps aux | grep <service-name> 查找特定服务。
  • ps fax 以树状图查看进程。
  • netstat -tulnpss -tulnp 查找运行在特定端口上的服务。
如何列出Linux上的运行服务

常见问题解答(FAQ)

1. 如何检查 Linux 上某个服务是否正在运行?

你可以根据自己的 Linux 发行版选用不同的方法:

  • 基于 systemd 的系统:
    systemctl status <service-name>
    
  • 基于 SysVinit 的系统:
    service <service-name> status
    
  • 使用 ps 和 grep:
    ps aux | grep <service-name>
    

2. 如何列出所有正在运行的服务?

  • 基于 systemd 的系统:
    systemctl list-units --type=service --state=running
    
  • 基于 SysVinit 的系统:
    service --status-all
    
  • 使用 ps 命令:
    ps aux
    

3. 如何检查某个服务是否开机自启?

  • systemd:
    systemctl is-enabled <service-name>
    
  • SysVinit(基于 RHEL 的系统):
    chkconfig --list <service-name>
    

4. 如何重启服务?

  • 基于 systemd 的系统:
    sudo systemctl restart <service-name>
    
  • 基于 SysVinit 的系统:
    sudo service <service-name> restart
    

5. 如何停止或禁用服务?

  • 临时停止某个服务:
    sudo systemctl stop <service-name>
    
  • 禁止某个服务开机自启:
    sudo systemctl disable <service-name>
    

6. 如何找出是哪个服务在占用某个端口?

你可以用 netstatss 来查找运行在特定端口上的服务:

netstat -tulnp | grep :80

ss -tulnp | grep :80

7. 如果找不到 systemctl 怎么办?

如果你遇到类似 command not found: systemctl 的错误,说明你的系统可能没有使用 systemd。可以试试:

service --status-all

ps aux | grep <service-name>

8. 如何列出失败的服务?

基于 systemd 的系统上,运行:

systemctl list-units --type=service --state=failed

9. 如何查看某个服务的日志?

要查看由 systemd 管理的服务的日志,请使用:

journalctl -u <service-name>

要实时查看日志:

journalctl -u <service-name> -f

10. 我可以用 tophtop 查看运行中的服务吗?

可以!tophtop 都能实时查看正在运行的进程:

  • 使用 top:
    top
    
  • 使用 htop(交互式,更易用):
    htop
    
    (如果没有安装,可用 sudo apt install htopsudo yum install htop 安装。)
LightNode