Linux系统提供多种系统服务(例如进程管理、登录、syslog、cron等)以及网络服务(例如远程登录、电子邮件、打印服务、网站托管、数据存储、文件传输、域名解析、动态IP地址分配等)。
从技术角度来说,服务是指一个或一组持续在后台运行的进程(通常称为守护进程,daemon),它们一直处于等待状态,直到有请求到来(尤其是来自客户端的请求)。
Linux支持多种方式来管理服务(例如启动、停止、重启、设置开机自动启动等),这些操作通常通过一个进程或服务管理器来完成,几乎所有现代的Linux发行版现在都使用同一个进程管理器:systemd。
什么是 Systemd?
Systemd是Linux的系统和服务管理器,它是init进程的替代品,兼容SysV和LSB的初始化脚本,用于管理systemd的主要工具是systemctl命令。
为什么要列出Linux中正在运行的服务?
了解Linux系统上正在运行哪些服务是至关重要的,主要表现在以下几个方面:
- 监控资源利用率
- 解决系统性能问题
- 确保关键服务正常运行
- 优化系统性能和安全性
Systemd通过强大的systemctl命令(也被称为基本命令)简化了服务管理,从而可以轻松列出、监控和管理活动服务。
接下来小编将演示如何在Linux系统中使用Systemd列出所有正在运行的服务,以便为不同经验水平的Linux用户提供全面的操作步骤,一起来看看吧。
在Linux中列出Systemd下正在运行的服务
当运行不带任何参数的systemctl命令时,它会显示所有已加载的systemd单元(unit)的列表(关于systemd单元的详细信息,请参阅systemd官方文档),包括服务,并显示它们的状态(是否处于激活状态)。
# systemctl
列出Linux中所有已加载的服务
要列出系统中所有已加载的服务(无论其状态是激活的、正在运行、已退出还是失败),请使用list-units子命令,并将--type
选项的值设置为service:
# systemctl list-units --type=service 或者 # systemctl --type=service
仅列出Linux中的活动服务
要列出所有已加载但处于活动状态的服务(包括正在运行的服务以及已退出的服务),可以添加值为active的--state
选项,命令如下:
# systemctl list-units --type=service --state=active 或者 # systemctl --type=service --state=active
列出Linux中正在运行的服务
但如果你想快速查看所有正在运行的服务(也就是所有已加载且处于活动状态的服务),可以运行以下命令:
# systemctl list-units --type=service --state=running 或者 # systemctl --type=service --state=running
下面来了解一些与Systemd单元(units)及其状态相关的重要术语,这有助于你更好地理解systemctl命令的输出。
- 单元(Unit):一个单元可以是一个服务、一个套接字、一个设备或各种其它实体。
- 加载(Load):表示单位是否已加载,单位可以加载但不一定是活动的。
- 活动(Active):显示设备是否正在运行或是否遇到问题并处于故障或非活动状态。
- 子状态(SUB): 提供有关单元特定状态的更多详细信息。对于服务,它可能指示服务是否正在运行(running)、已停止(exited)或遇到问题(failed)。
- 描述(Description): 它可以帮助用户识别和理解设备的用途,而无需深入研究详细的配置文件。
为systemctl命令创建别名
如果你经常使用前面的命令,可以在~/.bashrc文件中创建一个别名命令,以便轻松调用它。这样每次只需要输入别名,而不需要重复输入整个命令:
# vim ~/.bashrc
然后在别名列表下添加以下行,如下图所示:
alias running_services='systemctl list-units --type=service --state=running'
保存文件中的更改并关闭它。从现在开始,使用“ running_services ”命令便可查看服务器上所有已加载、正在运行的服务的列表:
# running_services
查找服务正在使用的端口
此外,服务的一个重要方面是它们使用的端口。要确定一个守护进程正在监听的端口,可以使用netstat或ss命令,如下所示。
其中-l
表示输出所有监听套接字、-t
显示所有TCP连接、-u
显示所有UDP连接、-n
显示数字端口号(而不是应用程序名称)以及-p
显示应用程序名称。
netstat -ltup | grep zabbix_agentd 或者 ss -ltup | grep zabbix_agentd
第五列显示了套接字,本地地址:端口。在本示例中,进程zabbix_agentd正在监听端口10050。
列出开放的防火墙服务和端口
此外,如果你的服务器正在运行防火墙服务,该服务控制如何阻止或允许流量进出选定的服务或端口,可以使用firewall-cmd或ufw命令列出防火墙中已打开的服务或端口(具体取决于你使用的Linux发行版),命令如下:
firewall-cmd --list-services [Firewall] firewall-cmd --list-ports sudo ufw status [UFW]
Linux中的自动化服务监控
手动检查正在运行的服务可能很繁琐,尤其是在生产服务器上,所以自动执行此过程可确保你始终了解服务状态的变化,而无需手动检查。
使用Cron Job每5分钟检查一次正在运行的服务
cron作业是Linux中按特定间隔运行的计划任务,你可以使用它定期记录正在运行的服务,并在发生故障或意外关闭时稍后查看它们:
crontab -e
添加此行以每5分钟记录一次正在运行的服务(可按需设置):
*/5 * * * * systemctl list-units --type=service --state=running > /tmp/running_services.log
输出将保存在/tmp/running_services.log
文件中,可以使用以下方式检查最新记录的服务:
cat /tmp/running_services.log 或者 tail -f /tmp/running_services.log
如果失败则重新启动服务
默认情况下,如果一个服务崩溃或意外停止,除非明确配置,否则不会自动重启。为了确保服务在失败时能够自动重启,你可以修改其systemd服务单元文件。
例如,使用以下命令编辑服务配置(替换apache2
为你要自动重启的实际服务名称):
systemctl edit apache2
进入编辑器后,添加以下行:
[Service] Restart=always RestartSec=5s
现在,重新加载systemd以应用更改:
systemctl daemon-reload
然后重新启动服务以确保它获取新设置:
systemctl restart apache2
确认systemd已设置为自动重启服务:
systemctl show apache2 --property=Restart
小结
在以上内容中,小编演示了在Linux中查看systemd下的运行服务大致步骤,同时还介绍了如何检查服务监听的端口以及查看系统防火墙中已打开的服务或端口,希望能够对大家有所帮助。
实际上,在Linux中查找正在运行的服务是系统管理员和开发人员日常工作中至关重要的一项任务,通过Systemd可以有效地管理和监控系统服务的状态、健康状况以及资源使用情况。