yeznable

[ 윈도우 서버 ] CMD 뜨지 않게 백그라운드 실행 본문

하는 일/데이터엔지니어링

[ 윈도우 서버 ] CMD 뜨지 않게 백그라운드 실행

yeznable 2024. 11. 4. 14:36
728x90

윈도우 서버를 운영하다보면 간절해지는 것중 하나가 nohup 기능이다.

리눅스 서버에서는 간단하게 nohup을 쓰면 백그라운드 실행이 가능한데 윈도우에서는 다양한 방법이 있다고는 하지만 nohup같은 깔끔함이 없이 CMD가 원하지 않는 모양으로 떠있는다던가 하는 상황이 있다.

 

윈도우 서버에 MinIO를 띄워놓아야 하는 상황이 생겼는데 여러가지 중에 어떤 방법으로 CMD가 뜨지 않는 백그라운드 실행을 했는지 정리 해둔다.

 

 

0. MinIO 실행

우선 내가 원하는 상황을 정리 해본다.

MinIO 서비스를 테스트 하는 겸 CMD에 띄워두고 별 불편함이 없어서 그대로 뒀다.

언젠가 같이 서버를 관리하는 분이 실수로 열려있던 CMD 창을 닫아서 MinIO 서비스가 중단되었다.

다행히 잠시 중단되어도 괜찮았던 서비스라서 일단 다시 살려뒀다.

이런 실수가 생기지 않을 수 있도록 nohup처럼 백그라운드에서 실행되도록 해야겠다고 생각했다.

 

MinIO를 실행하는 명령어는 다음과 같이 간단하다

## 형식
{실행파일 경로}\minio.exe server {데이터 저장 경로}

## 실제 코드
D:\minio_test\minio.exe server D:\minio_test\minio_data

 

CMD를 열어서 위의 명령어를 입력하면 다음과 같이 출력되면서 localhost:9000에 접속했을 때 MinIO 콘솔에 접속된다.

MinIO 서비스 실행 명령어 입력 결과

MinIO 관련 자세한 내용은 이 링크를 참고

 

MiniO (1/3) - 기본 사용법

기본적인 minio 사용법 입니다.

velog.io

 

1. 명령어 앞에 start 추가

백그라운드 실행에 대해 알아보면 가장 먼저 나오기도 하고 간단해보이는 방법이 nohup처럼  start를 명령어 앞에 붙여서 실행하는 거라고 한다.

## 실제 코드
start D:\minio_test\minio.exe server D:\minio_test\minio_data

 

위와 같이 명령어를 실행했을 때 내 상황에서는 문제 해결이 되지 않았다.

start 방법으로 실행한 결과

위의 사진과 같이 CMD에서는 명령어만 실행되고 따로 실행되는 것이 없었지만 "D:\minio_test\minio.exe"라는 실행 창이 뜬 것이다.

해당 실행 창을 끄면 MinIO 서비스도 종료된다.

 

2. bat 형식의 배치파일 작성 및 실행

윈도우에서 백그라운드 실행 방법으로 검색해서 나오는 방법에 배치파일을 활용하는 방법도 있다.

 

편한 에디터로 bat 형식의 파일을 만들어서 다음과 같이  @echo off 아래에 명령어를 쓰고 저장한다. 

작성된 배치파일

 

 

하지만 해당 배치파일을 더블클릭해서 실행시켰을 때 결국 CMD가 열리면서 명령어가 실행된다.

이렇게 열린 CMD를 닫으면 MinIO 서비스도 내려가게 되니 내가 원하는 결과가 아니다.

배치파일을 실행시켰을 때 CMD가 열리면서 명령어가 실행된 모습

 

3. bat 파일과 vbs 파일을 활용

더 찾아보니 이런 블로그 글을 찾아볼 수 있었다.

 

윈도우 배치파일(.bat) 백그라운드 실행 방법

개요 배치 파일이라고도 불리는 Windows 배치 스크립트(.bat 파일)는 Windows 운영 체제에서 명령어와 명령어 그룹을 실행하는 데 사용되는 텍스트 파일입니다. 이러한 스크립트를 사용하면 여러 명

syk531.tistory.com

 

 bat 파일에 명령어를 입력했던 것처럼 vbs 파일에 bat 파일을 실행하는 명령어를 실행하도록 하고 이를 백그라운드에서 실행한다는 것이다.

내 상황에 맞춰 vbs 파일을 작성하면 다음과 같이 된다.

작성된 vbs 파일

 

마지막에 입력된 0값이 1이면 CMD가 열리면서 실행되고 0이면 CMD가 열리지 않고 백그라운드에서 실행된다고 한다.

진짜로 그런지 궁금해서 1값을 넣어서 실행시켜봤더니 다음과 같이 CMD가 열렸다.

vbs 파일 마지막 파라미터가 1일 때 실행 결과

 

이제 해당 파라미터를 0으로 했을 때 내가 원하는 결과가 되는지 확인하기 위해 먼저 지금 MinIO 서비스가 실행되지 않는 상태가 맞는지 확인한다.

 

다음 netstat 명령어로 9000번 포트에 실행되고 있는 서비스를 찾아봤을 때 아무런 결과가 나오지 않는다.

netstat -ano | findstr 9000

9000번 포트에 실행되고 있는 서비스가 없음

 

그리고 이번에는 마지막 파라미터가 0으로 저장된 vbs 파일을 실행시켰을 때 CMD 창이 열리지 않았다.

다시 9000번 포트의 서비스를 확인한 결과 MinIO 서비스가 정상적으로 올라갔다.

 

이제는 CMD가 열려있고 닫혀있고와 상관 없이 MinIO 서비스가 유지되어 실수로 서비스가 내려가는 일이 없게 되었다.

 

이 상태에서 필요에 의해 서비스를 닫아야 할 수 있다.

우선 위의 netstat 명령어 실행 결과에서 해당 서비스의 pid가 10848이라는 걸 확인할 수 있다.(실행 결과에서 가장 오른쪽의 숫자값)

다음 명령어로 pid를 지정해 서비스를 종료할 수 있다.

## 형식
taskkill /f /pid {pid}

## 실제 명령어
taskkill /f /pid 10848

 

나는 /f(강제 종료 옵션) 없이도 해보고 추가도 해봤는데 결국 권한 오류가 떠서 CMD를 관리자 권한으로 열어야 했다.

관리자 권한으로 다시 강제 종료 옵션을 없이 해보고 추가했는데 /f 옵션을 추가했을 때 정상적으로 종료되었다.

종료 후에는 netstat 명령어로 9000포트에 실행되고 있는 서비스를 확인해봤을 때 결과가 없는 것으로 나온다.

실제로 localhost:9000으로 접속해봤을 때도 MinIO 콘솔에 접속할 수 없게 되었다.

 

728x90