答案:使用systemctl list-units --type=service --state=running命令可列出Linux系统中由systemd管理的正在运行的服务,该命令适用于CentOS 7/8、Ubuntu 16.04+等现代发行版,能清晰展示服务名称、状态及描述,是查看运行服务的首选方法。

在Linux系统上,要列出所有正在运行的服务,最直接有效的方法是使用
systemctl list-units --type=service --state=running命令。这个命令会清晰地展示那些由systemd管理且当前处于活动状态(running)的服务单元。它能帮你快速掌握系统当前的服务运行概况,是现代Linux发行版(如CentOS 7/8, Ubuntu 16.04+等)的首选工具。
解决方案
在我日常维护Linux服务器时,发现列出运行中的服务是一个非常基础但又频繁的操作。不同的场景和系统版本,我们可能会用到不同的命令,但核心目标都是一样的:了解系统当前有哪些后台任务在默默工作。
首先,对于大多数现代Linux发行版,
systemd是无可争议的服务管理器。它强大、高效,而且功能全面。要查看所有正在运行的服务,我会首选
systemctl:
systemctl list-units --type=service --state=running
这条命令的输出通常包括服务名称(UNIT)、加载状态(LOAD)、活动状态(ACTIVE)、子状态(SUB)以及简短描述。
LOAD显示单元文件是否成功加载,
ACTIVE是关键,它告诉我们服务是否处于活动状态,而
SUB则提供了更细致的运行状态,比如
running就表示服务正常运行。
有时候,我可能想看所有服务,无论它们是否运行,以便了解系统可能启动的服务有哪些,这时我会用:
systemctl list-units --type=service --all
然后通过
grep running来过滤,或者直接观察
ACTIVE列。这种方法的好处是,即使某个服务目前没有运行,你也能看到它的存在,并进一步检查它的状态或日志。
对于一些较老的系统,或者那些仍然依赖
SysVinit或
Upstart的发行版(虽然现在很少见了),
service命令可能更熟悉:
service --status-all
这个命令会列出所有通过
SysVinit脚本管理的服务,并用
[ + ]表示运行中,
[ - ]表示停止,
[ ? ]表示状态未知或无法确定。不过,它的输出格式通常不如
systemctl那么规范和易读,而且无法管理
systemd原生的服务单元。
最后,如果你想从更底层的进程角度去理解,
ps命令配合
grep也是一个办法,但它更多是列出进程,而不是“服务”:
ps aux | grep -i 'service_name'
例如,要查看Apache进程,你可以
ps aux | grep httpd。但这需要你知道服务的具体进程名,而且一个服务可能由多个进程组成,所以它不如
systemctl那样能直接反映“服务”的抽象概念。我通常在怀疑某个服务进程卡死,或者想确认某个特定进程是否存在时才用
ps。
如何区分不同类型的服务管理工具?
在Linux的世界里,服务管理工具的演变本身就是一段有趣的历史,也常常让人感到困惑。我个人觉得,理解它们之间的差异,对于我们高效管理系统至关重要。
最主要的两种服务管理体系是
SysVinit和
systemd。
SysVinit是老牌的服务管理器,它基于传统的Unix System V init脚本。在
SysVinit时代,每个服务通常对应
/etc/init.d/目录下的一组shell脚本。系统启动时,会按照预定义的运行级别(runlevel)顺序执行这些脚本,依次启动服务。它的优点是简单直观,脚本都是可读的shell脚本,容易理解和修改。但缺点也很明显:服务启动是串行的,效率低下;缺乏对服务依赖关系的精细管理;而且对进程的监控能力也比较弱,一个服务崩溃了,可能就停在那里了。我记得以前调试启动问题时,经常要一行行地看脚本输出,效率确实不高。
systemd则是现代Linux发行版的主流选择,它在设计理念上与
SysVinit截然不同。
systemd引入了“单元”(unit)的概念,服务只是其中一种单元(service unit)。它支持并行启动服务,这大大加快了系统启动速度。
systemd还提供了强大的依赖管理、cgroup集成(用于资源控制)、按需启动服务、日志管理(journald)等一系列高级功能。它的配置文件通常是
.service文件,位于
/etc/systemd/system/或
/usr/lib/systemd/system/等目录,采用INI风格,结构清晰。
systemctl是与
systemd交互的主要命令行工具,它能够管理服务的启动、停止、重启、状态查询,甚至创建自定义单元。对我而言,
systemd的强大之处在于其统一性和可控性,基本上所有系统级的操作都能通过它来完成。
介于两者之间,还有
Upstart,它曾是Ubuntu等发行版的默认初始化系统,旨在解决
SysVinit的一些痛点,比如支持事件驱动和并行启动。但随着
systemd的崛起,
Upstart逐渐被取代。
所以,当我们谈论“服务管理工具”时,现在基本上就是指
systemd和它的
systemctl。如果你遇到一台非常老的Linux机器,那可能还需要熟悉
service命令和
/etc/init.d/目录下的脚本。
如何判断服务是否异常或崩溃?
判断一个服务是否异常或崩溃,这可不只是看它是否“运行中”那么简单。有时候服务虽然显示“running”,但实际上可能已经卡死、资源耗尽或者功能不正常。这就像一个人虽然睁着眼睛,但可能已经神志不清了。
由于疫情等原因大家都开始习惯了通过互联网上租车服务的信息多方面,且获取方式简便,不管是婚庆用车、旅游租车、还是短租等租车业务。越来越多租车企业都开始主动把租车业务推向给潜在需求客户,所以如何设计一个租车网站,以便在同行中脱颖而出就重要了,易优cms针对租车行业市场需求、目标客户、盈利模式等,进行策划、设计、制作,建设一个符合用户与搜索引擎需求的租车网站源码。 网站首页
我通常会采取多维度的方法来诊断:
systemctl status
: 这是我的第一步。这条命令会提供指定服务的详细状态信息,包括它的加载状态、活动状态、进程ID(PID)、内存使用情况,以及最近的几行日志输出。最关键的是要看Active:
这一行。如果显示active (running)
,通常是好的。但如果看到active (exited)
、inactive (dead)
、failed
,那就说明服务已经停止或崩溃了。特别是failed
状态,它会明确告诉你服务启动失败或运行中遇到了严重问题。我还会留意CGroup:
和Main PID:
,确认进程是否存在。journalctl -u
: 服务的日志是诊断问题的金矿。systemd
将所有服务的日志都集中到journald
中。使用journalctl -u
可以查看特定服务的所有日志。我通常会加上-e
(查看最新日志)或-f
(实时跟踪日志),然后寻找关键词,比如error
、failed
、exception
、segfault
等。这些错误信息往往能直接指出问题的根源,比如配置错误、依赖缺失或者代码bug。检查服务自身的日志文件: 很多应用程序服务(例如Web服务器Nginx、数据库MySQL)除了向
journald
报告外,还会将详细的运行日志写入自己的特定文件,通常在/var/log/
目录下,例如/var/log/nginx/error.log
或/var/log/mysql/error.log
。这些日志文件可能包含比journalctl
更详细的应用层错误信息,对于排查应用层问题至关重要。我会用tail -f
来实时监控这些日志。资源监控: 一个“假死”的服务可能仍然在运行,但却消耗了异常的CPU、内存或I/O资源。我会使用
top
、htop
或free -h
、iostat
等工具来监控系统资源。如果某个服务的进程突然占用大量CPU或内存,或者磁盘I/O异常高,那它很可能陷入了死循环、内存泄漏或其他异常状态。ps aux --sort=-%mem | head
或ps aux --sort=-%cpu | head
可以快速找出资源消耗大户。网络连接状态: 对于提供网络服务的应用,检查其监听端口是否正常也是一个好方法。
netstat -tulnp | grep
或ss -tulnp | grep
可以查看端口是否被监听,以及是哪个进程在监听。如果服务应该监听某个端口但却找不到,那它肯定没有正常启动或已经崩溃。
通过这些方法组合使用,我通常能比较全面地判断一个服务的健康状况,并快速定位问题所在。
在没有图形界面的服务器上,如何高效管理服务?
在没有图形界面的Linux服务器上管理服务,这几乎是每一个Linux系统管理员的日常。我个人觉得,命令行(CLI)虽然初看起来有些生硬,但一旦掌握,它的效率和灵活性是图形界面无法比拟的。
熟练运用
systemctl
: 这是基石。所有服务的启动、停止、重启、状态查询、启用/禁用开机自启等操作,都离不开它。例如,systemctl start nginx
启动Nginx,systemctl enable nginx
设置开机自启,systemctl restart mysql
重启MySQL。记住这些基本命令,能让你在管理服务时游刃有余。利用
grep
和awk
进行过滤和格式化:systemctl list-units
的输出有时会很长,尤其是在服务众多的系统上。这时候,grep
就是你的好帮手。比如,systemctl list-units --type=service --state=running | grep ssh
可以快速找到与SSH相关的运行服务。如果需要更复杂的文本处理,awk
或sed
能帮你提取特定字段或重新格式化输出,这对于编写自动化脚本尤其有用。使用
tmux
或screen
进行会话管理: 我经常需要在服务器上同时进行多项操作,或者执行一个耗时较长的命令,又不想断开SSH连接。tmux
(或者screen
)就是解决这个问题的利器。它允许你在一个终端会话中创建多个独立的窗口和面板,并且即使SSH连接断开,会话仍然会在服务器后台运行。这样,你可以启动一个日志跟踪命令,然后切换到另一个面板进行其他操作,或者直接退出SSH,下次再连接回来继续工作。这大大提升了工作效率和便利性。日志的实时监控与分析:
journalctl -f
和tail -f /var/log/some_service.log
是我最常用的日志监控命令。在调试服务问题时,实时查看日志输出能帮助我快速发现错误和异常行为。结合grep
,可以只显示包含特定关键词的日志行,例如journalctl -f -u nginx | grep error
。SSH密钥认证与别名: 频繁登录服务器,每次输入密码是很低效的。配置SSH密钥认证(
ssh-keygen
和ssh-copy-id
)可以实现无密码登录,既安全又方便。此外,在本地的~/.ssh/config
文件中为常用服务器设置别名,例如Host myserver
,Hostname 192.168.1.100
,User admin
,这样以后只需ssh myserver
就能登录,进一步简化了操作。简单的Shell脚本: 对于一些重复性的检查或管理任务,我会编写简单的Shell脚本来自动化。比如,一个脚本可以检查多个关键服务的运行状态,并在发现异常时发送通知。虽然不是复杂的配置管理工具,但对于个人或小型团队来说,这种轻量级的自动化非常实用。
通过这些命令行工具和技巧,即使没有图形界面,我们也能高效、精准地管理Linux服务器上的各项服务。









