본문 바로가기
기타Tip

윈도우에서 powershell 이용 초간단 통신 체크하기

by 크라크라 2025. 3. 24.

안녕하세요. 서비스 운영하다보면 간혹 서버 대 서버 간 통신을 체크가 필요할 경우가 생기게 됩니다. 

거래가 매우 많은 경우에는 그 거래 자체가 일종의 테스트 역할을 해 주기 때문에 별도로 체크를 할 필요성이 생기지는 않는데 간혹 거래가 생각보다 많지는 않고, 그렇다고 운용인력도 많지 않고, 돈도 없는 경우에는 종종 간단하게 체크를 할 수 있는 방법을 고민하게 됩니다. 

 

최근 버전의 윈도우에서는 특히 powershell 이 꽤나 강력한 기능을 가지고 있는데요. 그 기능을 이용해서 매우 싼 비용(0원) 으로 간단한 테스트를 돌릴 수 있습니다. 

 

특히, 한 번 파워쉘 스크립트를 작성해두고 나면 취향에 따라서 윈도우 작업 스케줄러에 스크립트를 등록해서 사람이 손으로 체크하지 않으면서도 지속적으로 서버 대 서버 사이의 통신도 체크가 가능합니다. 또한, 나름대로 회사/개인이 사용하시는 문자 혹은 알람 API가 따로 있다고 하신다면 매우 손쉽게 적용해볼 수 있다는 점도 장점입니다. 

 

다음 스크립트는 정상 서비스 상태인지를 체크한다기보다는, 현재 서비스가 일단 약속한 포트에 제대로 떠 있어서 정상적인 접근은 가능한 상태인지를 체크하는 스크립트입니다. 

 

서버 리스트 및 정상 상태를 체크할 timeout 을 지정하고, powershell 을 이용해서 직접 서버에서 TCP Client 를 실행하고 커넥트 시도를 하는 스크립트입니다. 연결이 성공했을 경우에는 바로 연결을 끊고 성공이라고 로그를 남기고, 연결이 실패했을 경우에는 알람API 에 GET 요청을 보내고, 연결 실패 정보를 전달합니다. 마지막으로 TCP Client 를 종료합니다.

 

$servers = @(
	"서버IP 서버port 서버명",
    "서버IP 서버port 서버명"
)

$timeout = 5000
$alarm_send_url = ""

# 필요에 따라 맞는 방식으로 인코딩
function UrlEncodeEucKr($text) {
	$encodedText = [System.Uri]::EscapeDatastring($text)
    return $encodedText
}

foreach ($server in $servers){
	$parts = $server -split " " 
    $hostname = $parts[0]
    $port = [int]$parts[1]
    $company = $parts[2]
    
    $tcpClient = New-Object System.Net.Sockets.TcpClient
    $asyncResult = $tcpClient.BeginConnect($hostname, $port, $null, $null)
    
    # tcp 연결 타임아웃 체크
    if($asyncResult.AsyncWaitHandle.WaitOne($timeout, $false)){
    	Write-Host "$hostname $port $company - 연결성공" -ForegroundColor Green
        $tcpClient.EndConnect($asyncResult)
    }
    else {
    	Write-Host "$hostname $port $company - 연결실패" -ForegroundColor Red
        
        Invoke-WebRequest -Uri $alarm_send_url -Method Get
    }
    
    $tcpClient.Close()
}

 

이 방법으로 약간만 관리를 하면서, 문제가 생겼을 때 알람을 바로 받을 수 있습니다. 다만, 너무 많은 연락을 받을 수도 있는점은 단점이겠네요. 더 좋은 방식이 있다면 자유롭게 수정해서 쓰면 될 것 같습니다. 

댓글