怎么用脚本获取服务依赖关系

wen 实用脚本 3

本文目录导读:

怎么用脚本获取服务依赖关系

  1. Windows 系统
  2. Linux 系统
  3. Docker 容器依赖
  4. 跨平台解决方案 (Python)
  5. 使用建议

获取服务依赖关系的方法取决于你的操作系统,以下是常见的脚本方案:

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))

使用建议

  1. Windows 环境:优先使用 PowerShell,功能更强大
  2. Linux Systemd:直接使用 systemctl 命令
  3. 批量处理:Python 脚本更灵活,支持跨平台
  4. 性能考虑:大规模系统建议导出到文件后再分析

选择哪种方案取决于你的操作系统和具体需求,如果只是临时查看,使用系统自带命令即可;如果需要自动化处理,Python 脚本更合适。

抱歉,评论功能暂时关闭!