최근에 회사 일이 너무 바빠서 진짜 오랜만에 글을 작성하네요~~ 앞으로는 꾸준히 작성해 보도록 노력하겠습니다.
💡 어떤 프로젝트?
내가 이번에 기여에 참여한 프로젝트 beszel이라는 경랑 시스템 모니터링 툴이다!
가볍고 직관적인 UI로 시스템 상태를 실시간으로 보여주는 도구인데, 특히 소규모 서버 환경에서 꽤 유용하다.
SMTP 프로토콜도 지원해서 서버의 상태별로 이메일을 전송해 줄 수 있다.
‼️어떤 문제?
[Bug]: Windows agent installer fails on Server 2022 core
회사에서 경량 시스템 모니터링 툴을 도입하려던 중 beszel이라는 오픈소스를 알게 되었다. 이 프로젝트에는 시스템에 모니터링 에이전트를 설치하는 beszel-agent가 포함되어 있으며, Windows 환경에서는 이 에이전트를 서비스로 등록해서 실행할 수 있도록 파워셸 설치 스크립트를 제공하고 있다.
하지만 Windows Server Core 환경에 beszel-agent를 설치하려는 과정에서 문제가 발생했다.
Windows Server Core는 winget을 사용할 수 없기 때문에, 설치 스크립트 내에서 scoop 방식으로 설치하게 된다. 그런데 scoop을 이용한 설치 방식에서는 nssm을 통해 서비스를 등록할 때, Application 경로와 AppDirectory 경로가 비정상적으로 오염되는 문제가 발생했다.
문제가 된 파워셸 코드 일부는 아래와 같다:
function Install-BeszelAgentWithScoop {
Write-Host "Adding beszel bucket..."
scoop bucket add beszel https://github.com/henrygd/beszel-scoops | Out-Null
Write-Host "Installing / updating beszel-agent..."
scoop install beszel-agent # 출력이 그대로 남아 있음
if (-not (Test-CommandExists "beszel-agent")) {
throw "Failed to install beszel-agent"
}
return $(Join-Path -Path $(scoop prefix beszel-agent) -ChildPath "beszel-agent.exe")
}
이 함수에서는 scoop install beszel-agent 명령어의 출력 결과를 따로 버리지 않고 그대로 둔 채, 이후 Join-Path를 통해 반환되는 값이 함수의 반환값이 된다.
문제는 PowerShell 함수에서 출력이 반환값에 함께 포함된다는 점이다. 즉, 설치 메시지와 실행 경로가 함께 섞여 반환되고, 이 값이 이후 nssm install 명령의 실행 경로로 그대로 전달된다. 이로 인해, 서비스 등록 시 Application과 AppDirectory 값에 불필요한 메시지가 포함되어 실행이 실패하거나 예기치 않은 동작을 하게 된다.
결국, 스크립트에서 출력 제어를 명확히 하지 않으면 Windows Server Core 환경에서 서비스 등록이 깨질 수 있는 문제가 있었다.
🛠️ 해결 방법
해결 방법은 생각보다 단순했다. 예전에도 PowerShell 자동화 스크립트를 작성하면서 비슷한 문제를 겪은 적이 있었기에, 익숙한 방식으로 접근했다.
문제의 원인은 scoop install beszel-agent 명령의 출력 결과가 그대로 함수의 반환값에 포함되면서, 이후 NSSM 서비스 등록에 사용되는 경로가 오염되는 것이었다. 따라서 해결책은 해당 명령의 출력을 명시적으로 버리는 것이다.
PowerShell에서는 명령의 출력을 버릴 때 Out-Null cmdlet을 사용한다.
따라서 다음과 같이 수정하면 된다:
scoop install beszel-agent | Out-Null
이렇게 하면 scoop 명령의 출력은 더 이상 반환값에 영향을 주지 않게 되고, 이후 NSSM 등록 시 사용하는 $AgentPath 변수에는 오직 실행 파일 경로만 담기게 된다.
이제 아래 NSSM 설치 명령도 정상적으로 작동한다:
& $nssmCommand install beszel-agent $AgentPath
이 변경을 통해 Windows Server Core 환경에서도 scoop 방식으로 beszel-agent를 정상적으로 설치하고 등록할 수 있게 되었다.
최근에 회사 일이 너무 바빠서 진짜 오랜만에 글을 작성하네요~~ 앞으로는 꾸준히 작성해 보도록 노력하겠습니다.
💡 어떤 프로젝트?
내가 이번에 기여에 참여한 프로젝트 beszel이라는 경랑 시스템 모니터링 툴이다!
가볍고 직관적인 UI로 시스템 상태를 실시간으로 보여주는 도구인데, 특히 소규모 서버 환경에서 꽤 유용하다.
SMTP 프로토콜도 지원해서 서버의 상태별로 이메일을 전송해 줄 수 있다.
‼️어떤 문제?
[Bug]: Windows agent installer fails on Server 2022 core
회사에서 경량 시스템 모니터링 툴을 도입하려던 중 beszel이라는 오픈소스를 알게 되었다. 이 프로젝트에는 시스템에 모니터링 에이전트를 설치하는 beszel-agent가 포함되어 있으며, Windows 환경에서는 이 에이전트를 서비스로 등록해서 실행할 수 있도록 파워셸 설치 스크립트를 제공하고 있다.
하지만 Windows Server Core 환경에 beszel-agent를 설치하려는 과정에서 문제가 발생했다.
Windows Server Core는 winget을 사용할 수 없기 때문에, 설치 스크립트 내에서 scoop 방식으로 설치하게 된다. 그런데 scoop을 이용한 설치 방식에서는 nssm을 통해 서비스를 등록할 때, Application 경로와 AppDirectory 경로가 비정상적으로 오염되는 문제가 발생했다.
문제가 된 파워셸 코드 일부는 아래와 같다:
function Install-BeszelAgentWithScoop {
Write-Host "Adding beszel bucket..."
scoop bucket add beszel https://github.com/henrygd/beszel-scoops | Out-Null
Write-Host "Installing / updating beszel-agent..."
scoop install beszel-agent # 출력이 그대로 남아 있음
if (-not (Test-CommandExists "beszel-agent")) {
throw "Failed to install beszel-agent"
}
return $(Join-Path -Path $(scoop prefix beszel-agent) -ChildPath "beszel-agent.exe")
}
이 함수에서는 scoop install beszel-agent 명령어의 출력 결과를 따로 버리지 않고 그대로 둔 채, 이후 Join-Path를 통해 반환되는 값이 함수의 반환값이 된다.
문제는 PowerShell 함수에서 출력이 반환값에 함께 포함된다는 점이다. 즉, 설치 메시지와 실행 경로가 함께 섞여 반환되고, 이 값이 이후 nssm install 명령의 실행 경로로 그대로 전달된다. 이로 인해, 서비스 등록 시 Application과 AppDirectory 값에 불필요한 메시지가 포함되어 실행이 실패하거나 예기치 않은 동작을 하게 된다.
결국, 스크립트에서 출력 제어를 명확히 하지 않으면 Windows Server Core 환경에서 서비스 등록이 깨질 수 있는 문제가 있었다.
🛠️ 해결 방법
해결 방법은 생각보다 단순했다. 예전에도 PowerShell 자동화 스크립트를 작성하면서 비슷한 문제를 겪은 적이 있었기에, 익숙한 방식으로 접근했다.
문제의 원인은 scoop install beszel-agent 명령의 출력 결과가 그대로 함수의 반환값에 포함되면서, 이후 NSSM 서비스 등록에 사용되는 경로가 오염되는 것이었다. 따라서 해결책은 해당 명령의 출력을 명시적으로 버리는 것이다.
PowerShell에서는 명령의 출력을 버릴 때 Out-Null cmdlet을 사용한다.
따라서 다음과 같이 수정하면 된다:
scoop install beszel-agent | Out-Null
이렇게 하면 scoop 명령의 출력은 더 이상 반환값에 영향을 주지 않게 되고, 이후 NSSM 등록 시 사용하는 $AgentPath 변수에는 오직 실행 파일 경로만 담기게 된다.
이제 아래 NSSM 설치 명령도 정상적으로 작동한다:
& $nssmCommand install beszel-agent $AgentPath
이 변경을 통해 Windows Server Core 환경에서도 scoop 방식으로 beszel-agent를 정상적으로 설치하고 등록할 수 있게 되었다.