[ 메신저 – 디스코드 ] PowerShell과 작업 스케줄러로 디스코드 서버 장애 알람 봇 만들기 3부: 작업 스케줄러 자동화 완벽 가이드 및 트러블슈팅

▶️ [시리즈 이전 글 보기]

지난 2부에서는 PowerShell의 Invoke-RestMethod를 활용해 서버의 상태를 수집하고, 디스코드 채널로 깔끔한 형태의 알람 메시지를 전송하는 스크립트(DiscordAlert.ps1)를 완성했습니다. 수동으로 실행했을 때 내 스마트폰의 디스코드로 알람이 울리는 경험을 하셨을 겁니다.

하지만 인프라 환경에서 엔지니어가 매번 서버에 원격 접속(RDP)하여 스크립트를 수동으로 더블클릭할 수는 없는 노릇입니다. 진정한 자동화란, 관리자가 서버에서 로그아웃한 상태이거나 서버가 예기치 않게 재부팅된 직후라도 백그라운드에서 스크립트가 스스로 완벽하게 작동하는 것을 의미합니다.

이번 마지막 3부에서는 Windows의 기본 내장 도구인 작업 스케줄러(Task Scheduler)를 활용하여, 우리가 만든 강력한 스크립트를 시스템의 심장부에 등록하고 무인 관제 자동화를 완성하는 방법, 그리고 실무에서 자주 겪는 실패 사례와 트러블슈팅 노하우까지 깊이 있게 파헤쳐 보겠습니다.

📝 핵심 내용 요약

  • 스크립트가 사용자 개입 없이 백그라운드에서 돌기 위해서는 ‘사용자의 로그온 여부에 관계없이 실행’ 옵션이 필수입니다.
  • 실행 계정을 Administrator로 할지, SYSTEM으로 할지에 따라 발생하는 관리 포인트와 네트워크 통신 제한의 차이를 명확히 인지해야 합니다.
  • PowerShell 스크립트를 스케줄러에 등록할 때는 단순 경로 지정이 아닌, 실행 정책 우회(ExecutionPolicy Bypass) 인수를 반드시 넘겨주어야 오류 없이 작동합니다.

1. 작업 스케줄러 실행 및 새 작업 만들기

Windows Server(또는 Windows 10/11) 환경에서 모든 자동화의 시작점인 작업 스케줄러를 실행합니다.

  1. 키보드의 Win + R 키를 누르고 실행 창에 taskschd.msc를 입력하거나, 시작 메뉴에서 ‘작업 스케줄러’를 검색하여 엽니다.
  1. 프로그램이 열리면 좌측 트리에서 ‘작업 스케줄러 라이브러리’를 클릭한 뒤, 우측의 ‘작업’ 패널에서 [작업 만들기…(Create Task…)]를 클릭합니다.
    (주의: 가이드 마법사 형태의 ‘기본 작업 만들기’가 아닌, 모든 상세 옵션을 제어할 수 있는 ‘작업 만들기’를 반드시 선택하셔야 합니다.)

2. [일반] 탭 설정: 백그라운드 무인 실행과 실행 계정의 이해 (★가장 중요)

새 작업 창이 열리면 가장 먼저 [일반(General)] 탭을 마주하게 됩니다. 이곳은 서버 무인화(자동화)를 결정짓는 핵심 설정들이 모여 있는 곳입니다.

  • 이름: Discord_Server_Daily_Alert (여러 작업 중에서도 목적을 한눈에 알 수 있도록 직관적으로 명명합니다.)
  • 설명: 매일 아침 8시 서버 상태 점검 및 디스코드 발송 스크립트
  • 보안 옵션: “사용자의 로그온 여부에 관계없이 실행(Run whether user is logged on or not)”을 선택합니다. 이 옵션이 활성화되어야만 관리자가 퇴근 후 세션을 종료해도 백그라운드에서 스크립트가 정상적으로 구동됩니다.
  • 권한: “가장 높은 권한으로 실행(Run with highest privileges)” 체크 박스에 체크합니다. 디스크 정보 조회나 이벤트 로그 접근 등 관리자 권한이 필요한 스크립트 명령어를 오류 없이 수행하기 위함입니다.
  • 운영 체제 구성: 드롭다운 메뉴를 열어 Windows Server 2016, 2019 또는 2022 등 현재 구동 중인 서버 환경에 가장 알맞은 OS를 선택합니다.

💡 실무 엔지니어 딥다이브: 어떤 계정으로 실행할 것인가?

‘작업을 실행할 때 사용할 사용자 계정’을 설정하는 부분에서 엔지니어들은 주로 두 가지 선택의 기로에 놓입니다. 각 계정의 특성을 정확히 알고 환경에 맞게 선택해야 합니다.

  1. 특정 관리자 계정 (예: Domain\Administrator 또는 로컬 Administrator)
    • 장점: 설정이 가장 직관적이고 무난합니다. 일반적인 사용자 환경과 동일하게 외부 인터넷 통신(Discord Webhook 전송)이 원활하게 이루어집니다.
    • 치명적인 단점: 작업을 등록할 때 해당 계정의 비밀번호를 입력해야 합니다. 만약 사내 보안 정책(예: 90일 주기 암호 변경)으로 인해 이 계정의 비밀번호가 변경된다면, 작업 스케줄러의 인증이 풀리면서 스크립트 실행이 조용히 실패(동작 안 함)하게 됩니다. 패스워드가 바뀔 때마다 스케줄러 설정에 들어가 비밀번호를 갱신해 주어야 하는 관리 포인트가 발생합니다.
  2. 시스템 로컬 계정 (NT AUTHORITY\SYSTEM)
    • 장점: 운영체제 자체의 최상위 권한 계정이므로 비밀번호가 존재하지 않습니다. 즉, 정기적인 암호 변경 정책의 영향을 받지 않아 한 번 등록해 두면 영구적으로 유지 관리가 필요 없다는 엄청난 장점이 있습니다. 계정 변경 버튼을 누르고 SYSTEM을 입력해 검색하면 적용할 수 있습니다.
    • 치명적인 단점: SYSTEM 계정은 로컬 자원 제어에는 강력하지만, 보안상의 이유로 외부 인터넷 네트워크로 빠져나가는 통신이 사내 프록시(Proxy)나 방화벽 설정에 의해 차단되는 경우가 종종 발생합니다. 디스코드 알람은 외부망 연동이 필수이므로, SYSTEM 계정으로 세팅 후 알람이 안 간다면 방화벽 이슈를 의심해야 합니다. (👉 초보자이거나 사내 네트워크가 깐깐한 편이라면 1번 관리자 계정 사용을 우선 추천합니다.)

3. [트리거] 탭 설정: 스크립트 실행 조건 부여

[트리거(Triggers)] 탭으로 이동하여 하단의 [새로 만들기…]를 클릭합니다. 스크립트가 ‘언제’, ‘무슨 일이 생겼을 때’ 작동할지 그 방아쇠(Trigger)를 설정하는 곳입니다.

일반적인 일일 점검 알람이라면 아래와 같이 시간을 지정합니다.

  • 작업 시작: 드롭다운에서 예약 상태(On a schedule) 선택
  • 설정: 좌측에서 매일(Daily) 선택 후, 알람을 수신하기 원하는 시간(예: 오전 8:00:00)을 지정하고 [확인]을 누릅니다.

(참고: [조건(Conditions)] 탭과 [설정(Settings)] 탭은 지금 당장 건드릴 필요가 없습니다. 랩탑의 배터리나 유휴 시간 등을 설정하는 곳이므로 서버 환경에서는 기본값 그대로 두셔도 무방합니다!)

💡 실무 응용 확장: 이벤트 로그 연동을 통한 ‘실시간 장애 관제 시스템’ 구축

만약 이전 제 블로그 포스팅인 [이벤트 뷰어에 사용자 지정 이벤트 ID 발생시키기 3부작]을 읽으셨다면, 이 트리거 탭에서 엄청난 응용이 가능합니다!

정해진 시간이 아니라, “서버에 심각한 오류 로그(예: ID 15004번 – 리소스 고갈 경고)가 발생한 그 즉시 알람을 보내게” 만들 수 있습니다.

  1. 작업 시작이벤트에 기록될 때(On an event)로 변경합니다.
  2. 로그: Application (또는 대상 로그 위치)
  3. 원본: JimmyScript (또는 등록한 이벤트 소스명)
  4. 이벤트 ID: 15004 (탐지할 고유 에러 코드)

이렇게 설정해 두면, 서버에 15004번 이벤트 로그가 찍히는 그 1초 찰나의 순간에 작업 스케줄러가 방아쇠를 당겨 디스코드 알람 스크립트를 백그라운드에서 실행시킵니다. 값비싼 상용 모니터링 솔루션 부럽지 않은 나만의 완벽한 ‘실시간 장애 관제 시스템’이 완성되는 것입니다!


4. [동작] 탭 설정: PowerShell 인수(Arguments)의 마법

[동작(Actions)] 탭으로 이동하여 [새로 만들기…]를 클릭합니다. 초보 엔지니어들이 스크립트 자동화를 시도하다가 가장 많이 좌절하고 실패하는 ‘마의 구간’이 바로 이 부분입니다. 집중해서 따라와 주세요.

단순히 스크립트 파일(.ps1)의 경로만 찾아보기로 등록해서는 절대 실행되지 않습니다. PowerShell 프로그램을 먼저 호출하고, 그 뒤에 옵션과 함께 스크립트를 던져주어야 합니다.

  • 동작: 프로그램 시작(Start a program)
  • 프로그램/스크립트: powershell.exe (확장자까지 정확히 입력합니다.)
  • 인수 추가(옵션) (★매우 중요): 아래의 코드를 띄어쓰기까지 정확하게 복사해서 붙여넣습니다. (단, 제일 끝의 큰따옴표 안쪽 경로는 본인의 실제 .ps1 파일 위치에 맞게 수정하셔야 합니다.)

Plaintext

-ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\TEST\DiscordAlert.ps1"

💡 왜 이런 긴 인수를 넣어야 할까요? 안전한 걸까요?

  • -ExecutionPolicy Bypass (실행 정책 우회): Windows Server는 기본적으로 악성 스크립트 방지를 위해 서명되지 않은 PowerShell 스크립트의 실행을 꽉 막고 있습니다. 이 인수를 넣으면, 서버 전체의 보안 설정을 영구적으로 무장해제하는 것이 아니라 오직 이 작업 스케줄러가 실행되는 해당 세션(프로세스)에 한해서만 임시로 정책을 통과하게 해줍니다. 보안을 해치지 않으면서 자동화를 이루어내는 정석적인 방법입니다.
  • -WindowStyle Hidden (숨김 모드): 이 옵션을 빼먹으면 매일 아침 8시마다 서버 화면 정중앙에 시커먼 PowerShell 콘솔 창이 번쩍! 하고 떴다가 사라집니다. 관리자가 서버에서 다른 작업 중일 때 매우 거슬리고 방해가 되기 때문에, 백그라운드에서 아무도 모르게 조용히 실행되도록 창을 숨겨주는 에티켓 같은 옵션입니다.
  • -File: 뒤이어 나오는 큰따옴표 안의 경로에 있는 스크립트를 최종적으로 실행하라는 지시어입니다. 경로에 띄어쓰기가 있을 수 있으므로 큰따옴표(" ")로 묶어주는 습관을 들이는 것이 좋습니다.

5. 저장 및 테스트 (디스코드 알람이 오지 않을 때의 트러블슈팅)

모든 탭의 설정이 끝났다면 우측 하단의 [확인]을 누릅니다. [일반] 탭에서 관리자 계정(Administrator 등)을 지정했다면, 시스템 권한 위임을 위해 해당 계정의 비밀번호를 묻는 보안 창이 팝업됩니다. 정확한 비밀번호를 입력하면 드디어 모든 작업 등록이 완료됩니다.

✅ 즉시 수동 실행 테스트 진행 내일 아침 8시나 이벤트가 발생할 때까지 막연히 기다릴 필요가 없습니다. 작업 스케줄러 중앙 리스트에서 방금 만든 Discord_Server_Daily_Alert 작업을 찾아 우클릭한 뒤 [실행(Run)]을 눌러보세요. 잠시 후 스마트폰 디스코드 앱에서 “띠링~” 하고 알람이 울린다면 100% 완벽하게 성공한 것입니다!

🛠️ 만약 디스코드에 알람이 오지 않는다면? (전문가 레벨 트러블슈팅)

실행을 눌렀는데도 디스코드 채널이 조용하다면 당황하지 마세요. 인프라 엔지니어답게 로그를 보고 원인을 추적하면 됩니다.

  1. 작업 스케줄러에서 해당 작업을 클릭하고, 하단에 위치한 [기록(History)] 탭을 클릭합니다. (만약 기록 탭이 비어있고 ‘사용 안 함’ 상태라면, 우측 메뉴 패널에서 ‘모든 작업 기록 사용(Enable All Tasks History)’을 클릭해 활성화한 뒤 다시 실행해 봅니다.)
  2. 기록 목록에서 ‘작업 완료(Task completed)’ 항목을 찾아 클릭한 뒤, 하단 상세 정보에서 ‘반환 코드(Return Code)’가 0x0 인지 확인합니다. 0x0은 시스템적으로 완벽하게 정상 종료되었음을 의미하는 마법의 숫자입니다.
  3. 반환 코드가 0x0이 아닌 다른 숫자(예: 0x1, 0x41301 등)일 경우의 정밀 진단법:
    • [동작 탭 오타 의심]: powershell.exe 철자를 틀렸거나 인수(Arguments) 부분에서 띄어쓰기를 실수했을 확률이 높습니다. 파일 경로에 오타가 없는지 다시 꼼꼼히 확인하세요.
    • [비밀번호 변경 의심]: [일반] 탭에서 설명했듯, 작업을 등록할 때 사용했던 관리자 계정의 비밀번호가 그사이에 변경되었다면 인증 실패로 인해 스크립트가 돌지 않습니다. 작업 속성에 들어가 비밀번호를 재등록해야 합니다.
    • [SYSTEM 계정의 네트워크 차단 의심 (가장 놓치기 쉬움)]: 반환 코드는 정상(0x0)이 떨어졌는데 알람만 안 온다면? 앞서 일반 탭에서 설명한 내용과 직결됩니다. 실행 계정을 SYSTEM으로 세팅했을 경우, 스크립트 구동 자체는 성공했지만 디스코드 웹훅 서버(discord.com)로 뻗어나가는 외부 인터넷 POST 요청이 사내 보안 장비(방화벽/프록시)에 의해 SYSTEM 계정 권한 레벨에서 조용히 드랍(Drop)되었을 확률이 높습니다. 이 경우 일반 관리자 계정으로 변경하여 실행해 보시길 권장합니다.

6. 마무리

지금까지 1부의 디스코드 웹훅 생성, 2부의 PowerShell JSON 연동 스크립트 작성, 그리고 이번 3부의 작업 스케줄러 백그라운드 자동화 및 심화 트러블슈팅까지 이어지는 기나긴 대장정을 모두 마무리했습니다. 정말 고생 많으셨습니다!

이제 여러분이 관리하는 서버는 단순한 쇳덩어리가 아니라, 스스로 자신의 상태를 체크하고 오류가 발생하면 즉시 관리자의 디스코드로 실시간 보고를 올리는 ‘똑똑한 무인 인프라’로 진화했습니다.

이 PowerShell + 작업 스케줄러 + 웹훅 연동 방식은 하나의 표준 템플릿입니다. 이 구조만 이해하셨다면 응용할 수 있는 분야는 무궁무진합니다. 매일 백업이 완료되었을 때 성공 여부 발송, 디스크 용량이 90%를 넘겼을 때 경고 발송, 특정 서비스가 죽었을 때 알람 발송 등 여러분만의 훌륭한 자동화 관제 시스템을 자유롭게 구축해 보시기 바랍니다.

블로그를 찾아주시는 수많은 주니어 엔지니어 분들의 야근 시간이 이 글로 인해 조금이나마 줄어들기를 진심으로 응원합니다! 따라 하시면서 막히는 부분이나 궁금한 점이 있다면 언제든 편하게 댓글로 남겨주세요. 감사합니다.

답글 남기기

Your email address will not be published. Required fields are marked *.

*
*