想查看linux服务器启动了哪些服务,最直接的办法就是执行 systemctl list-units --type=service --state=running,它会以列表形式把当前正在运行的服务全部列出来。 不同系统版本、不同管理工具,查看方式也有差异,下面我把常用方法一次讲透。
linux服务器查看正在运行的服务用什么命令?
systemctl:主流Linux系统的标准答案
如果你用的是CentOS 7、Ubuntu 16.04以上版本,systemd已经是默认的初始化系统,systemctl就是最权威的服务管理器,打开终端,输入:
systemctl list-units --type=service --state=running
输出会分成四列:UNIT(服务名)、LOAD(是否加载)、ACTIVE(激活状态)、SUB(子状态),只关心正在运行的服务,就认准running这个状态。
如果输出太长,想单独找某个服务,比如sshd,可以这样过滤:
systemctl list-units --type=service --state=running | grep sshd
想连开机自启状态一起看,用:
systemctl list-unit-files --type=service --state=enabled
这条命令列出的不是“当前正在跑”的服务,而是“开机会自动跑”的服务,两者对照,你才能判断哪些服务是主动启动的,哪些是被依赖关系拉起来的。
ps命令:从进程角度反推服务
服务本质上是进程,所以ps也是查服务的常用入口,最稳妥的组合是:
ps -ef | grep 服务名
ps -ef | grep nginx
你会看到master进程和worker进程,说明nginx正在运行,如果服务名不确定,用ps aux查看全部进程,然后按CPU或内存占用排序:
ps aux --sort=-%mem | head -20
这样能快速找出占用资源最高的服务进程,不过要注意:一个服务可能对应多个进程,比如nginx有master和worker,Apache也有多个子进程,光看进程名称容易误判。
ss和netstat:通过端口反查服务
想知道哪个服务在监听某个端口,ss是现在的推荐命令:
ss -tlnp
-t显示TCP,
-l显示监听状态,-n不解析域名,-p显示进程和对应的服务名,需要root权限才能看到完整进程信息,普通用户可能只能看到端口。
旧一些的系统没有ss,用netstat也行:
netstat -tlnp
输出结果里,Local Address:Port那一列是监听地址,PID/Program name就是对应的服务进程,这条命令特别适合排查“明明服务起来了,但端口不通”的问题。
linux查看服务状态命令,systemctl和service到底怎么选?
很多老教程还在用service --status-all,但现代系统里,service只是一个兼容旧脚本的封装,底层仍然会调用systemd,所以我的建议很直接:
优先用systemctl
systemctl status 服务名可以查看单个服务的详细状态,包括是否正在运行、主进程PID、占用内存、最近日志等。
systemctl status nginx
如果状态显示Active: active (running),说明服务正常,显示failed或inactive (dead),就要进一步看日志。
老系统再用service
如果你还在维护CentOS 6或Ubuntu 14.04,这些系统没有systemd,只能用:
service --status-all
或者:
chkconfig --list
前者显示所有服务的运行状态,后者显示开机自启配置,这类系统现在占比已经很小,除非接手老服务器,否则不用纠结。
两套命令对比
| 功能 | systemctl | service/chkconfig |
|---|---|---|
| 查看运行中服务 | systemctl list-units --type=service --state=running |
service --status-all |
| 查看单个服务状态 | systemctl status 服务名 |
service 服务名 status |
| 查看开机自启 | systemctl list-unit-files --type=service --state=enabled |
chkconfig --list |
| 适用系统 | CentOS 7+、Ubuntu 16.04+ | CentOS 6、Ubuntu 14.04 |
业内专家指出,目前生产环境里超过九成的linux服务器都在用systemd,花时间学
systemctl绝对不亏。
centos查看运行中的服务,这三招最实用
如果你是CentOS用户,尤其习惯了yum和iptables,下面这三招帮你快速掌握自己的服务器上到底跑了哪些服务。
第一招:用systemctl把运行中和开机自启的服务一起拉出来
CentOS 7以上版本,先看正在运行的:
systemctl list-units --type=service --state=running
再看开机自启的:
systemctl list-unit-files --type=service --state=enabled
把两份结果对比一下:如果一个服务在自启列表里,但当前没运行,那可能启动失败了,需要查日志;如果一个服务在运行但没出现在自启列表,那多半是手动启动的,重启后会丢。
第二招:用ss查端口,锁定服务与IP的对应关系
很多场景下,比起服务名,你更关心的是“哪个IP和端口在看”,执行:
ss -tlnp
输出示例(简化):
0.0.0:80对应nginx0.0.1:3306对应mysqld
看到0.0.0,说明服务监听在所有网卡上,外部可以访问;看到0.0.1,说明只监听本机,外部访问不了,这对排查安全漏洞很有用。
第三招:用ps加排序,找出异常占用资源的服务
服务器变卡,先别急着重启,用:
ps aux --sort=-%cpu | head -10
这条命令按CPU占用降序排列,前面几行就是最吃CPU的进程,再按内存排一遍:
ps aux --sort=-%mem | head -10
如果发现某个服务占用异常高,比如java进程吃掉几个G内存,再用systemctl status确认是不是你预期中的服务,如果是意料之外的进程,就要检查是否被入侵了。
查完服务之后,怎么判断哪些该留哪些该关?
先分清服务类型
linux服务器上常见的服务大致分几类:
- 核心服务:sshd(远程登录)、network(网络)、crond(定时任务)、systemd-journald(日志),这些建议保留。
- 业务服务:nginx、httpd、mysql、redis,按需开启,不用的就关。
- 辅助服务:postfix(邮件)、cups(打印)、avahi-daemon(mDNS广播),很多服务器用不到,可以关掉。
判断标准很简单:你不清楚用途的服务,先别动,用systemctl status 服务名看描述,或者查一下文档,确认无用再关。
关闭和禁止自启的实操步骤
假设你判断cups服务用不到,执行:
systemctl stop cups systemctl disable cups
stop是立即停止,disable是取消开机自启,如果你只想临时停,不取消自启,就只执行stop。
关闭前先确认依赖
有些服务被其他服务依赖,直接停掉会导致连锁问题,可以用:
systemctl list-dependencies --reverse 服务名
看哪些服务依赖于它,如果有业务服务依赖,就先处理业务服务,或者干脆不关。
Q&A:linux服务器查看起了哪些服务的常见疑问
为什么systemctl看不到docker里面的服务?
Docker容器里的进程与宿主机是隔离的,systemctl只能看到宿主机上的服务,想查看容器内跑了什么,需要进入容器或者在宿主机上用docker ps查看运行中的容器,再用docker exec -it 容器名 ps aux看容器内的进程。
服务显示运行中,但端口没监听,怎么回事?
这种情况多半是服务启动时配置错误,导致主进程起来了,但监听socket没建立,先看状态和日志:
systemctl status 服务名 journalctl -u 服务名 -n 50
比如nginx配置文件里写了错误的端口或监听地址,就可能出现这种状态,另一种可能是服务只监听了Unix socket文件,不监听TCP端口,比如某些数据库的本地连接方式。
怎样一次查看所有服务,包括启动失败的那些?
用--all参数加上--state过滤即可:
systemctl list-units --type=service --all --state=failed
这条命令专门列出启动失败的服务,日常巡检时,我会把它和running状态的列表一起看,一边确认正常服务,一边排查异常服务,两条命令加起来十秒内就能对服务器状态心里有数。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/740390.html





