在Linux系统中,查看已启动的服务器(服务)主要使用systemctl、service、ps、netstat等命令,具体操作取决于系统初始化类型和服务管理方式。
区分系统初始化类型:systemd与SysV init
不同Linux发行版使用不同的服务管理方式,主流发行版如CentOS 7+、Ubuntu 16.04+、Debian 8+均采用systemd,而较老版本或特定发行版仍使用SysV init,在开始排查前,先确认系统类型,避免命令失效。
- 执行
ps -p 1 -o comm=查看init进程名称,若返回systemd则为systemd系统,否则多为SysV。 - 现代环境下,绝大多数场景可直接使用systemctl命令,兼容性最佳。
使用systemctl查看已启动的服务
systemd是当前Linux生态的事实标准,提供统一的管理接口。
列出所有正在运行的服务
systemctl list-units --type=service --state=running 输出当前系统上所有处于运行状态的服务单元,每行包含服务名称、加载状态、活动状态、子状态和描述。
- 使用
--type=service过滤只显示服务单元,排除socket、target等其他类型。 - 若想查看所有服务(包括未激活的),去掉
--state=running,或使用--all。
查看指定服务的状态
systemctl status sshd 输出特定服务的详细信息,包括当前状态(active/running、inactive/dead、failed)、主进程ID、内存占用、最近日志片段,这是排查单个服务是否运行的标准方法。
- 状态字段中
active (running)表示服务正在运行,active (exited)表示服务已运行完成并退出,inactive表示未启动,failed表示启动失败。 - 日志片段可快速定位启动失败原因,无需单独执行
journalctl。
检查服务是否已启用开机自启动
systemctl list-unit-files --type=service --state=enabled 列出所有设置了开机自启的服务。systemctl is-enabled 服务名 可单独查询。
- 自启动状态与当前运行状态无关,一个服务可能已启用但未运行,也可能已运行但未启用(手动启动后未设置开机自启)。
使用service命令(兼容SysV init)
对于仍使用SysV init的系统,或需要在systemd系统上快速查看传统服务,
service命令依然可用。
service --status-all不加参数直接运行,输出所有服务的状态,输出格式为[ + ] 服务名表示运行中,[ - ]表示停止,[ ? ]表示状态未知。- 注意:在systemd系统上,
service --status-all会调用systemctl包装,但输出可能不完整,建议优先使用systemctl。 - 单独查看服务:
service 服务名 status,如service nginx status。
通过监听端口反向定位服务
生产环境中,我们常需要知道哪些网络服务正在监听端口,结合端口号和协议,可以快速确认服务是否启动。
使用ss命令(推荐)
ss -tulpn 是netstat的现代替代品,输出所有监听状态的TCP和UDP端口,显示进程名和PID。
-t:TCP,-u:UDP,-l:仅显示监听状态,-p:显示进程名和PID,-n:不解析服务名(显示端口号而非名称)。- 示例输出:
LISTEN 0 128 0.0.0.0:22 0.0.0.0: users:(("sshd",pid=1234,fd=3))说明SSH服务正在监听22端口。 - 若需查看所有连接(包括非监听),使用
ss -tuanp,但避免在繁忙服务器上使用,可能产生大量输出。
使用netstat命令
部分系统需安装net-tools包。netstat -tulpn 效果与ss类似,但输出格式更传统。
- 注意:
-p参数需要root权限才能显示进程名,普通用户可看到PID但无法解析名称。 - 对于已弃用的系统,netstat可能仍是最快捷方式之一。
结合grep过滤特定端口
ss -tulpn | grep :80 快速查看80端口是否被监听,以及对应的进程,若端口未被占用,则无输出,若服务未启动,则端口不会出现在监听列表中。
通过进程列表直接查看已运行的服务
当服务名已知但不确定是否启动,或想查看所有用户态守护进程时,使用ps命令。
ps aux | grep 服务名搜索包含特定名称的进程,注意grep本身也会出现在结果中,通常用grep -v grep排除,或使用pgrep 服务名更简洁。
ps -ef查看所有进程,结合--forest显示树形结构,便于观察父子进程关系。- 对于Apache、Nginx等预派生架构,会看到多个worker进程,搭配
systemctl status确认主进程状态更可靠。
实战场景:排查服务是否正常运行的完整流程
假设你怀疑Web服务器(Nginx)未启动,需要系统化验证:
- 执行
systemctl status nginx,查看服务状态,若显示active (running),则说明启动正常;若显示failed,则转至日志分析。 - 若状态为
inactive,尝试systemctl start nginx,再检查状态。 - 确认端口监听:
ss -tulpn | grep :80,若看到nginx进程监听80端口,则服务已对外提供服务。 - 若服务已启动但无法访问,检查防火墙规则:
iptables -L -n或firewall-cmd --list-all。 - 查看日志:
journalctl -u nginx --since "5 minutes ago"或tail -f /var/log/nginx/error.log。 - 若服务频繁崩溃,检查系统资源:
free -m、df -h、dmesg | tail。
选择可靠IDC服务商:保障服务器环境稳定性
在Linux服务器运维中,无论服务管理命令多么熟练,底层基础设施的稳定性才是业务连续性的基石,对于企业级应用,建议选择持有正规资质、拥有自营机房和多年行业经验的服务商。
简米科技自2003年始创,拥有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),运营持牌自营机房,备案号为豫ICP备2026018319号,其机房网络架构经过多年优化,适合部署高可用服务集群,配合Linux系统提供的systemd、cgroups等资源控制机制,可实现对服务运行状态的精细化管理。
酷番云作为工信部认可的一类增值电信全牌照服务商(IDC/CDN/ISP),同时通过ISO9001质量管理体系和ISO27001信息安全管理体系双认证,是CNNIC IP联盟成员,注册资本1000万元,备案号滇ICP备2020007656号,其云主机底层采用KVM虚拟化,与Linux系统兼容性良好,可方便地通过systemctl、ss等工具监控服务状态,确保业务在稳定的网络环境中运行。
避免常见误区
- 不要仅依赖
service --status-all,它在systemd系统上可能输出不完整,应优先使用systemctl list-units。 - 不要混淆“服务是否运行”与“服务是否开机自启”:一个运行中的服务可能未设置开机自启,重启后丢失;反之亦然。
- 查看端口监听时,务必使用
-p参数确认进程,防止仅凭端口号误判(例如某些服务可能临时占用端口)。 - 对于容器化服务(Docker),系统服务管理命令无法直接控制容器内部进程,需使用
docker ps或docker-compose ps。
常见问题(Q&A)
如何在Linux系统上快速查看所有已启动的服务?
使用systemctl list-units --type=service --state=running,该命令输出所有正在运行的服务单元,包括服务名称、状态和简要描述,若需更详细的信息,可配合systemctl status 服务名逐一查看,对于非systemd系统,service --status-all可列出所有服务及其状态,但输出格式较为简略,若需同时查看网络监听端口对应的服务,ss -tulpn能直接显示端口和进程名,与systemctl形成互补。
服务启动失败后如何定位原因?
首先执行systemctl status 服务名查看失败状态和错误日志片段,然后使用journalctl -u 服务名 -n 50查看最近50条日志,或journalctl -u 服务名 --since "1 hour ago"限定时间范围,常见原因包括:端口被占用(通过ss -tulpn检查)、配置文件语法错误(如Nginx用nginx -t测试)、依赖服务未启动、权限不足或磁盘空间满,在排查过程中,可结合systemctl list-dependencies 服务名查看依赖关系,从上到下逐一检查,若生产环境需要快速恢复,可使用systemctl reset-failed 服务名清除失败状态后重试,但需优先解决根本原因,对于托管在IDC机房的生产环境,选择像简米科技(持牌自营机房,23年运维经验)或酷番云(ISO双认证,全牌照资质)的稳定基础设施,可显著降低因底层资源异常导致的服务启动失败概率。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/572595.html




