在系统管理和运维工作中,通过命令行查看服务的启动状态、启动时间、启动命令等信息是一项基础且重要的技能,不同操作系统(如Windows、Linux、macOS)提供的命令行工具和命令语法有所不同,但核心目标一致:快速获取服务的运行状态和启动相关细节,本文将分操作系统详细介绍如何通过命令行查询服务启动信息,并辅以实例说明和对比表格,帮助读者掌握不同场景下的操作方法。
Windows系统下查看服务启动信息
Windows系统提供了多种命令行工具,包括传统的cmd
命令提示符和更强大的PowerShell,两者均支持查看服务状态,但功能和输出格式有所差异。
使用cmd命令提示符
cmd是Windows内置的基础命令行工具,通过sc
(Service Control)命令和net
命令可快速查询服务状态。
-
sc query
命令:sc query
是查看服务状态的核心命令,可列出所有服务的详细信息,或针对特定服务查询。- 基本语法:
sc query [服务名]
- 示例:
- 查看所有服务状态:
sc query
(输出较长,建议结合findstr
过滤,如sc query | findstr "STATE"
仅显示状态行)。 - 查看特定服务(如“Themes”):
sc query Themes
- 查看所有服务状态:
- 输出关键字段解析:
STATE
:服务当前状态,常见值有1 STOPPED
(停止)、2 START_PENDING
(启动中)、3 RUNNING
(运行中)、4 STOP_PENDING
(停止中)等。WIN32_EXIT_CODE
:进程退出码,0
表示正常,非0
表示异常。SERVICE_EXIT_CODE
:服务自身退出码,0
表示正常。
- 基本语法:
-
net start
命令:net start
用于列出当前已启动的服务,适合快速查看运行中的服务列表。- 基本语法:
net start
- 示例:
net start | findstr "Themes"
(查看“Themes”服务是否已启动)。
- 基本语法:
-
tasklist
命令:
通过进程列表反向关联服务,适用于已知服务名称但需确认进程是否运行的场景。- 基本语法:
tasklist /svc | findstr "服务名"
- 示例:
tasklist /svc | findstr "svchost"
(查看svchost进程关联的服务,svchost是Windows服务托管进程)。
- 基本语法:
使用PowerShell
PowerShell提供更丰富的对象化输出和筛选功能,适合复杂查询和自动化处理。
-
Get-Service
cmdlet:Get-Service
是PowerShell中获取服务信息的核心命令,支持按名称、状态等筛选。- 基本语法:
Get-Service [[-Name] <字符串>] [-DisplayName <字符串>] [-Status <服务状态>]
- 示例:
- 查看所有运行中的服务:
Get-Service | Where-Object {$_.Status -eq "Running"}
- 查看特定服务(如“Spooler”)的详细信息:
Get-Service -Name "Spooler" | Format-List *
(显示所有属性)
- 查看所有运行中的服务:
- 关键属性解析:
Status
:服务状态(Running
/Stopped
/Stopping
等)。StartType
:启动类型(Automatic
/Manual
/Disabled
,分别代表自动启动、手动启动、禁用)。DisplayName
:服务显示名称(与内部名称Name
可能不同)。StartTime
:服务启动时间(需通过Get-WmiObject
或Get-CimInstance
获取,Get-Service
默认不直接提供)。
- 基本语法:
-
Get-CimInstance
cmdlet(获取更详细的服务信息):
通过WMI(Windows Management Instrumentation)可获取服务的启动时间、进程ID等扩展信息。- 基本语法:
Get-CimInstance -ClassName Win32_Service -Filter "Name='<服务名>'"
- 示例:
Get-CimInstance -ClassName Win32_Service -Filter "Name='Spooler'" | Select-Object Name, DisplayName, StartMode, State, StartTime
- 输出字段:
StartMode
对应启动类型,State
对应状态,StartTime
为启动时间(若服务未运行,此字段为空)。
- 基本语法:
Linux系统下查看服务启动信息
Linux系统服务管理因初始化系统不同(如systemd、SysVinit)而存在差异,现代Linux发行版(如Ubuntu 16+、CentOS 7+)多采用systemd,传统系统则使用SysVinit,以下分别介绍两种场景下的命令。
使用systemd(现代Linux发行版)
systemd是目前主流的初始化系统,通过systemctl
命令管理服务,功能强大且支持丰富的状态查询。
-
systemctl list-units
命令:
列出所有单元(服务、挂载点等),可按状态筛选。- 基本语法:
systemctl list-units [--type=service] [--state=状态]
- 示例:
- 查看所有运行中的服务:
systemctl list-units --type=service --state=running
- 查看所有失败的服务:
systemctl list-units --type=service --state=failed
- 查看所有运行中的服务:
- 输出字段:
LOAD
(是否加载)、ACTIVE
(当前状态,如active
/inactive
)、SUB
(子状态,如running
/exited
)、DESCRIPTION
(服务描述)。
- 基本语法:
-
systemctl status
命令:
查看特定服务的详细状态,包括启动时间、进程ID、日志等。- 基本语法:
systemctl status [服务名]
- 示例:
systemctl status nginx
- 输出关键信息:
Active: active (running) since [时间]
:服务运行状态及启动时间。Main PID: [PID]
:主进程ID。Status: "[状态描述]"
:服务状态描述(如”OK”)。- 日志尾部:显示最近的服务日志(可通过
--no-pager
禁用分页)。
- 基本语法:
-
systemctl is-active
/is-enabled
命令:
快速检查服务是否运行或是否设置为开机启动。- 基本语法:
systemctl is-active [服务名]
(返回active
/inactive
/failed
) - 基本语法:
systemctl is-enabled [服务名]
(返回enabled
/disabled
/static
)
- 基本语法:
-
journalctl
命令(查看服务日志):
通过日志可追溯服务启动过程和错误信息。- 基本语法:
journalctl -u [服务名] [--since="时间"]
- 示例:
journalctl -u nginx --since="2024-01-01"
(查看nginx服务自2024年1月1日以来的日志)。
- 基本语法:
使用SysVinit(传统Linux系统)
老旧Linux系统(如CentOS 6、Ubuntu 14.04)使用service
和chkconfig
管理服务。
-
service
命令:
查看或控制服务状态。- 基本语法:
service [服务名] [status|start|stop]
- 示例:
service httpd status
(查看Apache服务状态,返回httpd is running
或httpd is stopped
)。
- 基本语法:
-
chkconfig
命令:
管理服务开机启动状态,可查看所有服务的启动级别。- 基本语法:
chkconfig --list [服务名]
- 示例:
chkconfig --list httpd
(输出显示服务在 runlevel 2-5 的启动状态,on
表示开机启动,off
表示禁用)。
- 基本语法:
macOS系统下查看服务启动信息
macOS基于Unix,使用launchd
作为初始化系统,通过launchctl
命令管理服务,同时也可结合ps
和log
命令查看进程和日志。
launchctl
命令
launchctl
是macOS服务管理的核心工具,用于加载、卸载和查询服务。
-
launchctl list
命令:
列出所有已加载的服务(包括系统服务和第三方服务)。- 基本语法:
launchctl list [服务名]
- 示例:
- 查看所有服务:
launchctl list
(输出列包含PID
、Status
、Label
(服务标识))。 - 查看特定服务(如“com.apple.mDNSResponder”):
launchctl list "com.apple.mDNSResponder"
- 查看所有服务:
- 输出解析:
PID
为-1
表示服务未运行,数字表示进程ID;Status
为0
表示正常。
- 基本语法:
-
launchctl print
命令(macOS 10.10+):
查看服务的详细配置信息,包括启动参数、依赖关系等。- 基本语法:
launchctl print [服务名]
- 示例:
launchctl print "com.apple.sshd"
(查看SSH服务的详细配置)。
- 基本语法:
ps
命令和log
命令
-
ps
命令:通过进程列表查看服务是否运行。- 基本语法:
ps aux | grep [服务关键词]
- 示例:
ps aux | grep "nginx"
(查看nginx进程,确认服务是否运行)。
- 基本语法:
-
log
命令(macOS 10.12+):查看系统日志,过滤服务相关日志。- 基本语法:
log show --predicate 'subsystem == "[服务标识]"'
- 示例:
log show --predicate 'subsystem == "com.apple.sshd"' --last 1h
(查看最近1小时SSH服务日志)。
- 基本语法:
不同系统命令对比
为方便查阅,以下表格汇总了Windows、Linux(systemd)、macOS下查看服务启动的核心命令及功能:
操作系统 | 工具/命令 | 功能描述 | 示例 |
---|---|---|---|
Windows (cmd) | sc query [服务名] |
查看服务状态和详细配置 | sc query Themes |
Windows (PS) | Get-Service [服务名] |
获取服务对象信息(状态、启动类型等) | Get-Service -Name "Spooler" |
Windows (PS) | Get-CimInstance |
获取服务启动时间等扩展信息 | Get-CimInstance -ClassName Win32_Service -Filter "Name='Spooler'" |
Linux (systemd) | systemctl status [服务名] |
查看服务详细状态(含启动时间、日志) | systemctl status nginx |
Linux (systemd) | systemctl list-units --type=service --state=running |
列出所有运行中的服务 | systemctl list-units --type=service --state=running |
Linux (SysVinit) | service [服务名] status |
查看服务运行状态 | service httpd status |
macOS | launchctl list [服务名] |
列出已加载服务及其PID状态 | launchctl list "com.apple.mDNSResponder" |
macOS | log show --predicate 'subsystem == "[服务标识]"' |
查看服务日志 | log show --predicate 'subsystem == "com.apple.sshd"' |
相关问答FAQs
Q1:如何通过命令行精确查看服务的启动时间?
A:不同系统下获取启动时间的方法不同:
- Windows:使用PowerShell结合
Get-CimInstance
,Get-CimInstance -ClassName Win32_Service -Filter "Name='Spooler'" | Select-Object Name, StartTime
若服务未运行,
StartTime
为空。 - Linux (systemd):
systemctl status [服务名]
会直接显示启动时间,systemctl status nginx # 输出中包含 "Active: active (running) since 2024-01-01 10:30:00 CST"
- macOS:通过
log
命令查询服务首次启动时间,log show --predicate 'subsystem == "com.apple.sshd"' --start "$(date -v -1d)" | grep "Started" | tail -1
或使用
launchctl print [服务名]
查看last loaded time
(最近加载时间)。
Q2:为什么某些服务状态显示为“激活失败”(Failed),如何排查?
A:服务“激活失败”通常因配置错误、依赖缺失、资源不足或权限问题导致,排查步骤如下:
- Windows:
- 使用
eventvwr.msc
打开事件查看器,查看“Windows日志”→“系统”中服务相关的错误事件(事件ID通常为7026、7000等)。 - 命令行可通过
wevtutil qe System /c:10 /rd:true /f:text | findstr "服务名"
过滤日志。
- 使用
- Linux (systemd):
- 运行
systemctl status [服务名]
查看日志尾部错误信息(如“Failed to listen on [地址]: 权限不足”)。 - 使用
journalctl -u [服务名] -b
查看本次启动以来的服务日志,-b
表示从本次启动开始。 - 检查服务依赖:
systemctl list-dependencies [服务名]
确认依赖服务是否正常运行。
- 运行
- macOS:
- 运行
log show --predicate 'subsystem == "[服务标识]"' --last 1h
查看最近1小时日志,定位错误信息。 - 检查服务配置文件位置(如
/Library/LaunchDaemons/
或/System/Library/LaunchDaemons/
),确认文件权限和语法正确。
- 运行
通过以上步骤,可快速定位服务激活失败的原因并针对性修复。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/16177.html