在Linux系统上查看启用了哪些服务器,最直接的方法是使用systemctl list-units --type=service --state=running命令,它能列出所有正在运行的服务单元,让你对系统当前开放的“大门”一目了然。
用systemctl命令摸清系统家底
Linux系统的服务管理如今基本都由systemd接管,systemctl就是它的控制台,想快速知道系统现在跑着哪些服务,打开终端敲入下面这行命令:
systemctl list-units --type=service --state=running
执行后,你会看到类似下面的输出:
UNIT LOAD ACTIVE SUB DESCRIPTION
ssh.service loaded active running OpenBSD Secure Shell server
nginx.service loaded active running A high performance web server
mysql.service loaded active running MySQL Community Server
docker.service loaded active running Docker Application Container Engine
每一行代表一个正在运行的服务,UNIT列是服务名称,DESCRIPTION列则用通俗语言解释了它是干什么的,这个方法适合快速了解整体情况,但如果你只想看和“服务器”相关的服务,Web 服务器、数据库服务器,可以配合grep过滤。
linux怎么查看开启了哪些服务这个具体问题,还可以用更简洁的systemctl子命令:
systemctl list-units --type=service --state=running --no-pager | grep -E 'http|nginx|apache|mysql|ssh|ftp'
这条命令会直接过滤出常见的服务器软件,如果你发现某个服务你不认识,或者觉得它占用了不该占用的资源,可以用systemctl status 服务名查看它的详细信息,包括启动时间、进程ID和最近日志。
端口监听视角:看服务器开了哪些“门”
服务运行的本质是监听端口。linux查看端口占用情况是判断服务器是否在运行的最直观手段。ss命令是现代 Linux 系统内置的工具,比老的netstat更快更准。
ss -tlnp
参数含义:
-t显示 TCP 端口
-l只显示监听状态的端口-n以数字形式显示端口号,不做域名反解-p显示占用该端口的进程信息
输出结果中,Local Address:Port列如果是0.0.0:80或[::]:443,说明这个服务绑定了所有网络接口,外部机器可以访问。Process列会直接显示进程名和 PID,比如users:(("nginx",pid=1234,fd=6)),这就告诉你 80 端口是被 nginx 占用的。
如果你想看某个特定端口是否被监听,3306(MySQL),可以这样:
ss -tlnp | grep 3306
如果没有任何输出,说明该端口没有进程监听,服务可能没启动或者配置了别的端口。行业共识认为,定期检查端口监听状态是Linux服务器日常运维的基本功,能有效发现未授权的服务暴露。
进程与系统日志:交叉验证服务状态
有时候服务明明在跑,但systemctl显示状态异常,或者端口监听正常但服务无法访问,这时候需要从进程和日志两个维度交叉验证。
查看进程列表,确认服务是否真的活着:
ps aux | grep -E 'nginx|apache|mysql|sshd'
输出的每一行代表一个进程,STAT列如果是S(睡眠)或R(运行)通常没问题,如果显示Z(僵尸)或T(停止)就需要排查了。
查看系统日志是定位问题的关键,用journalctl可以查看某个服务的全部日志:
journalctl -u nginx.service -n 50
-n 50表示显示最近50行,日志里会明确告诉你服务启动失败的原因,比如端口被占用、配置文件语法错误等,如果你怀疑某个服务异常启动,但systemctl里看不到,可以检查/var/log/syslog或/var/log/messages文件,里面记录了系统所有服务的启动痕迹。
对于linux服务器管理服务的场景,一个实用技巧是查看开机自启项,因为有些服务是系统启动时自动拉起的:
systemctl list-unit-files --type=service --state=enabled
这个命令会列出所有设置为开机自启的服务,你可能发现某台服务器上意外启用了telnet.socket或者rlogin.service这类老旧的远程登录服务,它们极不安全,建议立即禁用。
图形化工具与远程排查:让查询更直观
如果你是在带图形界面的 Linux 桌面系统上操作,或者通过远程管理工具连接服务器,还有更直观的方式。
使用htop或glances等实时监控工具,它们会在交互界面里列出所有进程,按F4键过滤进程名,输入nginx就能看到所有相关进程及其 CPU、内存占用,这类工具适合长期观察服务资源消耗情况。
远程排查场景下,比如你人在外面,通过 SSH 连回服务器,systemctl和ss命令依然是首选,但如果你管理的机器比较多,写一个简单的 Shell 脚本批量执行检查会更高效:
for host in server1 server2 server3; do
ssh $host "systemctl list-units --type=service --state=running | grep -E 'nginx|mysql'"
done
这个脚本会依次登录三台服务器,列出它们运行的关键服务,方便你快速对比多台机器配置是否一致。据统计,运维人员在排查故障时,有相当一部分时间浪费在重复登录多台机器执行相同命令上,批量脚本能显著提升效率。
安全视角:确认哪些服务不该开启
查看已启用的服务器,不光是为了知道有什么,更是为了确认不该有的东西没有跑起来,安全基线检查中,以下服务通常建议保持禁用:
telnet.socket:明文传输密码,极易被窃听rsh.socket:远程 shell 服务,无加密vncserver@.service:如果未配置访问控制,可能暴露桌面环境ftp.service:传统 FTP 明文传输,建议使用 SFTP 替代cups.service:打印服务,多数服务器用不到
检查这些服务是否运行:
systemctl status telnet.socket rsh.socket vsftpd.service
如果状态显示为inactive或dead,说明它们没有运行,但要注意,有些服务可能在运行但没监听端口,比如cups服务只监听本地回环地址,外部无法访问,这种风险较低。
linux查看服务器运行了哪些服务时,还要关注服务的启动用户,nginx 的 worker 进程应该以nginx用户运行,而不是 root,如果发现某个服务以 root 权限运行且暴露在公网,这属于严重的安全隐患。
常见问题解答
Q1:为什么我执行systemctl list-units --type=service看不到我手动启动的脚本?
因为systemctl只管理由 systemd 注册的服务,如果你直接执行./start.sh或通过nohup启动的进程,它们不属于 systemd 管理范围,这类进程需要用ps aux | grep 脚本名来查看,如果想让它被 systemd 管理,可以编写一个 systemd service 单元文件放到/etc/systemd/system/目录下。
Q2:如何判断一个端口是安全的外部服务还是潜在的攻击入口?
用ss -tlnp查看端口对应的进程名,再用lsof -i :端口号查看详细连接信息,如果进程名是nginx或sshd这类常见服务,且监听地址是0.0.0,说明是正常服务,如果进程名很陌生,或者监听在高端口(如 4444、6667),并且你从未配置过,需要立即用systemctl status 进程名查看详情,并检查系统日志确认是否有异常登录记录。
Q3:查看服务状态时,loaded和active有什么区别?
loaded表示 systemd 已经读取了该服务的配置文件,但服务可能还没启动。active表示服务当前正在运行。active (running)是正常状态,active (exited)表示服务运行后正常退出,比如某些一次性任务,如果状态是failed,说明服务启动失败,需要用journalctl -u 服务名查看失败原因。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/739416.html





