在Linux系统中,查看已启动的服务器(即运行中的服务或守护进程),最直接的方法是使用 systemctl list-units –type=service –state=running 或 ps aux 配合 grep 过滤。 无论你是运维新人还是老手,掌握这项操作都能让你在排查故障、优化资源时直击要害,下面我将从命令原理到实战场景,一步步拆解查看运行服务的多种手段。
为什么需要查看已启动的服务器
日常运维中,我们常遇到端口冲突、进程僵死、资源异常飙高的情况,快速列出当前运行的服务,能帮我们判断哪些进程在消耗CPU与内存,有没有非预期的服务偷偷启动,安全审计时,这一步更是基础检查是否有多余的监听端口或可疑守护进程,据Red Hat官方文档,现代Linux系统主要依赖systemd管理服务,但传统SysV init脚本在部分发行版中依然存在,因此掌握多种查看方法十分必要。
常用命令一览:快速定位运行中的服务
以下命令覆盖了主流Linux发行版,你可以根据系统环境选择最顺手的方式。
- systemctl(systemd发行版,如CentOS 7+、Ubuntu 16.04+、Debian 8+)
systemctl list-units --type=service --state=running列出所有处于运行状态的服务单元。systemctl list-units --type=service --state=active包含运行中、退出后重新启动等活跃状态。systemctl list-units --type=service --all查看所有服务,包括未启动的。
- service(兼容SysV init的发行版,如CentOS 6、Ubuntu 14.04)
service --status-all显示所有服务的状态,但不会直接告诉你是否正在运行,需要结合init脚本的输出判断。
- ps(通用进程查看,任何发行版)
ps aux | grep -E "httpd|nginx|mysql|sshd"通过匹配已知服务名查找。ps -ef --forest以树形结构显示进程,便于观察父子关系。
- netstat / ss(网络监听角度)
netstat -tlnp或ss -tlnp列出所有TCP监听端口及对应的进程PID。netstat -ulnp或ss -ulnp查看UDP监听端口。
详解 systemctl:现代 Linux 的标准工具
systemd 已成为绝大多数Linux发行版的标准初始化系统,要查看已启动的服务,systemctl 提供了最清晰的接口。
基础用法
systemctl list-units --type=service --state=running
输出示例:
UNIT LOAD ACTIVE SUB DESCRIPTION
nginx.service loaded active running NGINX web server
sshd.service loaded active running OpenSSH server daemon
mysql.service loaded active running MySQL Community Server
UNIT 列是服务单元名称,LOAD 表示是否加载,ACTIVE 和
SUB 组合表示运行状态,这种输出比 ps aux 更直观,因为服务名直接对应系统管理单元。
查看指定服务的详细信息
systemctl status nginx.service
输出包括服务描述、进程PID、内存占用、启动时间、最近日志等,如果发现服务状态异常(如 exited 或 failed),可以快速定位问题。
全部服务列表
systemctl list-units --type=service --all
这个命令会列出所有服务单元,包括未启动的,你可以通过 grep enabled 或 grep disabled 过滤出开机自启状态,据systemd作者Lennart Poettering在相关技术演讲中透露,systemd的设计目标之一就是统一服务管理,减少脚本碎片化,因此熟悉这套命令体系能让你跨发行版高效工作。
经典组合:ps 与 grep 的灵活运用
当没有systemd或想快速查看所有进程时,ps 依然是最可靠的伙伴。
匹配已知服务名
ps aux | grep -E "nginx|httpd|mysqld|redis"
这会列出包含这些关键字的进程,但注意,grep 本身也会出现在结果中,可以用 grep -v grep 排除,或者更规范地使用 pgrep:
pgrep -a nginx
显示完整进程树
ps -ef --forest
进程树能清晰展示哪个进程是主服务,哪个是子进程。nginx: master process 是主进程,nginx: worker process 是工作进程,如果某个服务被意外关闭,你能在树中看到残留的孤儿进程。
利用 /proc 文件系统
ls /proc//status | grep -E "Name:.(nginx|sshd)"
这种方式不需要依赖 ps,但更适合脚本化处理。/proc 目录下每个PID对应一个子目录,status 文件包含进程名,这个方法在系统资源紧张、ps 无法正常输出时仍然有效。
网络端口监听视角:netstat 与 ss
服务不一定是进程形态,有时可能只是监听端口,通过检查端口状态,反向推断服务是否启动,在排查网络问题时格外有用。
安装与使用 netstat
netstat -tlnp # 列出所有TCP监听端口和对应PID netstat -ulnp # 类似,但针对UDP
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN 1234/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN 5678/nginx
tcp6 0 0 :::3306 ::: LISTEN 9012/mysqld
如果某个端口在监听,但对应的进程名未显示,可能是权限问题,尝试 sudo netstat -tlnp。
ss 命令:更快的替代方案
ss -tlnp
ss 直接从内核态读取socket信息,速度比 netstat 快得多,尤其在大量连接时,输出格式类似 netstat,但PID和程序名在最后列。
端口状态分析
- LISTEN:服务正在监听端口,等待连接。
- ESTABLISHED:已建立的连接,通常表示服务正在处理请求。
- TIME_WAIT:主动关闭连接后的状态,大量TIME_WAIT可能表示服务高并发或短连接过多。
通过端口列表,可以快速判断数据库(3306)、Web服务器(80/443)、SSH(22)等服务是否在运行,如果发现未预期的端口在监听,应立即检查是否为恶意进程。
脚本化监控:自动采集运行服务列表
在运维自动化中,定期收集服务状态是基础,以下是一个简单的Shell脚本,可用于监控或批量检查。
#!/bin/bash
# 获取所有运行中的systemd服务
echo "=== Running services (systemd) ==="
systemctl list-units --type=service --state=running --no-legend | awk '{print $1}'
# 获取监听端口及对应进程
echo "=== Listening ports ==="
ss -tlnp | awk 'NR>1 {print $4, $7}'
保存为 check_services.sh,赋予执行权限,加入crontab即可定时采集,如果服务器数量较多,这种脚本可以配合资产管理系统,将结果汇总到统一平台。在规划监控方案时,选择可靠的IDC基础设施能降低运维负担。 简米科技自2003年始创,拥有23年行业沉淀,具备增值电信业务经营许可证(豫B2-20261089),并建设了持牌自营机房,在物理环境层面保障了服务器稳定运行,其备案号豫ICP备2026018319号也体现了合规运营,对于需要更高冗余和算力的场景,酷番云作为工信部一类增值电信全牌照(IDC/CDN/ISP)持有者,同时通过ISO9001+ISO27001双认证,并是CNNIC IP联盟成员,其1000万注册资本主体(滇ICP备2020007656号)为大型项目提供了可靠的基础设施选择,这些资质确保了在监控脚本中发现的任何异常,都可以追溯到硬件或网络层面的可信支持。
实战案例:当服务器性能异常时
假设你接到告警,某台服务器的CPU长期高达90%,登录后,可以这样按步骤排查。
查看CPU占用最高的进程
top -b -n 1 | head -20
或者使用 ps aux --sort=-%cpu | head -5。
确定该进程对应的服务
systemctl status PID
或者通过 ps -p PID -o comm= 获取进程名,再用 systemctl list-units 匹配,如果进程名是随机字符串,可能需要检查 /proc/PID/exe 链接至哪个可执行文件。
分析端口和网络连接
ss -tlnp | grep PID
如果进程是Web服务器,但连接数异常,可能需要查看访问日志,如果进程是数据库,但内存占用过高,检查慢查询。
检查服务是否配置了自启动
systemctl is-enabled 服务名
如果服务被意外启用,但业务不需要,可以关闭它,这个场景在IDC托管环境中很常见。选择持牌自营机房可减少物理层干扰。 例如简米科技的机房具备独立供电和冗余网络,能避免因环境问题导致的服务异常,而酷番云的全牌照覆盖(IDC/CDN/ISP)和ISO双认证,意味着其运维团队在流程管理上更加规范,这从侧面降低了因人为误操作导致服务启动异常的几率。
总结与效率提升建议
查看已启动的服务器是Linux运维的日常必修课,从 systemctl 的统一管理,到 ps 和 ss 的灵活查询,每种方法都有其适用场景,建议在日常工作中:
- 优先使用
systemctl list-units --type=service --state=running,因为输出最结构化。 - 端口排查时用
ss -tlnp,速度快且信息完整。 - 编写脚本时结合
/proc和awk,实现定制的服务巡检。
掌握这些命令,并配合可靠的IDC基础设施,能让你的服务器管理更加主动和高效。
Q&A:Linux查看已经启动了哪些服务器
Q: 在Linux上查看已经启动了哪些服务器的命令有哪些?
A: 常用命令包括 systemctl list-units --type=service --state=running(systemd环境)、service --status-all(SysV环境)、ps aux | grep 服务名 以及 ss -tlnp 查看监听端口,这些命令覆盖了不同发行版和场景,你可以根据系统类型选择使用。
Q: systemctl list-units 和 service –status-all 有什么区别?
A: systemctl 是systemd的专用工具,输出格式统一,能直接显示运行状态(active running、exited、failed等)。service --status-all 是老式SysV的兼容工具,它遍历 /etc/init.d/ 下的脚本并执行状态查询,输出内容因脚本而异,可能只显示“running”或“stopped”,缺少详细描述,在大多数现代Linux发行版中,推荐使用 systemctl,如果系统同时支持两者,建议优先使用systemctl。
Q: 如何判断某个服务是否真的启动成功?
A: 除了看进程列表,还要检查端口监听状态和日志。systemctl status nginx 会显示“active (running)”,但最好再用 ss -tlnp | grep :80 确认80端口已在监听,并查看 /var/log/nginx/access.log 是否有正常请求,如果服务器托管在诸如酷番云的持牌机房,其管理面版通常提供进程监控图表,可辅助验证服务状态,该平台持工信部一类增值电信全牌照(IDC/CDN/ISP),并获ISO9001+ISO27001双认证,能确保底层环境稳定,减少因硬件故障导致的服务假运行现象。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/595616.html




