本文目录导读:

获取服务依赖关系的方法取决于你的操作系统,以下是常见的脚本方案:
Windows 系统
PowerShell 脚本
# 获取所有服务及其依赖关系
Get-Service | Select-Object Name, DisplayName, DependentServices, ServicesDependedOn |
Format-Table -AutoSize
# 导出到 CSV 文件
Get-Service | Select-Object Name, DisplayName, @{Name="DependsOn";Expression={($_.ServicesDependedOn | ForEach-Object {$_.Name}) -join "; "}}, @{Name="DependentServices";Expression={($_.DependentServices | ForEach-Object {$_.Name}) -join "; "}} | Export-Csv "service_dependencies.csv" -NoTypeInformation
# 查询特定服务的依赖
$serviceName = "W3SVC" # 替换为你要查询的服务名
Get-Service -Name $serviceName | Select-Object Name, DisplayName, DependentServices, ServicesDependedOn
CMD 批处理脚本
@echo off REM 列出所有服务及其依赖 sc query type= service state= all | findstr /i "SERVICE_NAME DISPLAY_NAME" REM 查看特定服务的依赖关系 set SERVICE_NAME=W3SVC sc qc %SERVICE_NAME% REM 查看依赖该服务的其他服务 sc enumdepend %SERVICE_NAME%
Linux 系统
Systemd 系统 (CentOS 7+, Ubuntu 16.04+, Debian 8+)
#!/bin/bash # 获取所有服务依赖关系的 Bash 脚本 # 查看所有服务的依赖关系 systemctl list-dependencies --all # 查看特定服务依赖 SERVICE_NAME="nginx" systemctl list-dependencies $SERVICE_NAME # 查看反向依赖 (谁依赖该服务) systemctl list-dependencies --reverse $SERVICE_NAME # 导出到文件 systemctl list-dependencies --all > service_deps.txt # 更详细的依赖关系 systemctl show -p Requires,Wants,Conflicts $SERVICE_NAME
SysV Init 系统 (较老的 Linux)
#!/bin/bash # SysV 系统的依赖检查 chkconfig --list # 查看特定服务的运行级别和依赖 chkconfig --list | grep "3:on"
递归获取所有依赖 (Python 脚本)
#!/usr/bin/env python3
import subprocess
import json
def get_service_deps(service_name, reverse=False):
"""获取服务的依赖关系"""
cmd = f"systemctl list-dependencies {'--reverse' if reverse else ''} {service_name}"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
deps = []
for line in result.stdout.split('\n'):
if '●' in line or '─' in line:
# 解析服务名称
parts = line.split()
for part in parts:
if part.endswith('.service') or part.endswith('.target'):
deps.append(part)
return deps
# 使用示例
service = "sshd"
print(f"{service} 依赖于:")
for dep in get_service_deps(service):
print(f" - {dep}")
print(f"\n依赖 {service} 的服务:")
for dep in get_service_deps(service, reverse=True):
print(f" - {dep}")
Docker 容器依赖
#!/bin/bash
# 获取 Docker 容器之间的依赖关系
# 查看 docker-compose 依赖
docker-compose config --services
# 查看容器网络连接
docker network inspect bridge
# 通过标签或环境变量获取依赖关系
docker ps --format "{{.Names}}: {{.Labels}}" | grep "com.docker.compose.depends_on"
跨平台解决方案 (Python)
#!/usr/bin/env python3
"""
跨平台服务依赖获取工具
"""
import platform
import subprocess
import re
def get_windows_deps():
"""Windows 服务依赖"""
import win32serviceutil # 需要安装 pywin32
import win32service
services = {}
hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ENUMERATE_SERVICE)
for service in win32service.EnumServicesStatus(hscm):
name = service[0]
handle = win32service.OpenService(hscm, name, win32service.SERVICE_QUERY_CONFIG)
config = win32service.QueryServiceConfig(handle)
services[name] = {
'name': name,
'display_name': config[1],
'dependencies': list(config[5]) if config[5] else []
}
return services
def get_linux_deps():
"""Linux 系统服务依赖"""
deps = {}
# 获取所有服务
result = subprocess.run(['systemctl', 'list-units', '--type=service', '--all'],
capture_output=True, text=True)
service_names = re.findall(r'([\w-]+\.service)', result.stdout)
for service in service_names:
deps[service] = {
'name': service,
'dependencies': get_service_deps(service, reverse=False),
'dependents': get_service_deps(service, reverse=True)
}
return deps
if __name__ == "__main__":
system = platform.system()
if system == "Windows":
deps = get_windows_deps()
elif system == "Linux":
deps = get_linux_deps()
else:
print(f"Unsupported OS: {system}")
exit(1)
# 输出为 JSON
print(json.dumps(deps, indent=2))
使用建议
- Windows 环境:优先使用 PowerShell,功能更强大
- Linux Systemd:直接使用
systemctl命令 - 批量处理:Python 脚本更灵活,支持跨平台
- 性能考虑:大规模系统建议导出到文件后再分析
选择哪种方案取决于你的操作系统和具体需求,如果只是临时查看,使用系统自带命令即可;如果需要自动化处理,Python 脚本更合适。