운영체제별 게임 프로세스 감지 문제와 실전 해결기

들어가며

GameAdvisor 프로젝트를 개발하면서, “내 컴퓨터에서는 잘 되는데?”라는 흔한 함정에 빠졌던 경험을 공유드리고자 합니다. 이번에는 윈도우 환경에서 게임 프로세스 감지 기능이 제대로 동작하지 않는 문제를 직접 겪으면서, 운영체제별 차이를 실감하게 되었습니다.

문제 상황: 윈도우에서 감지가 안 된다?

처음에는 macOS와 리눅스에서 아무 문제 없이 동작하던 게임 프로세스 감지 기능이, 윈도우에서는 전혀 작동하지 않았습니다. 단순한 코드 오류나 경로 문제라고 생각했지만, 로그를 아무리 살펴봐도 원인을 찾을 수 없었습니다.

원인 분석: 명령어의 차이

문제의 핵심은 바로 운영체제별로 지원하는 명령어의 차이였습니다. 기존에는 유닉스 계열에서 널리 쓰이는 ‘ps’ 명령어를 사용해 실행 중인 프로세스 목록을 가져왔는데, 윈도우에서는 이 명령어 자체가 존재하지 않았던 것입니다. 실제로 윈도우 명령 프롬프트에서 ‘ps’를 입력하면 ‘명령을 찾을 수 없습니다’라는 메시지만 출력됩니다.

시행착오와 해결 과정

  1. 코드 재점검: 우선 기존 코드를 꼼꼼히 살펴보며, 혹시 경로 문제나 인코딩 이슈가 있는지 확인했습니다. 하지만 macOS/리눅스에서는 정상 동작하는 코드라면 윈도우에서도 동작해야 한다는 막연한 기대가 있었던 것 같습니다.
  2. 구글링과 공식 문서 탐색: ‘윈도우 프로세스 목록 명령어’, ‘ps 대체 명령어’ 등 다양한 키워드로 검색을 시작했습니다. 그 결과 윈도우에서는 ‘tasklist’라는 명령어를 사용해야 한다는 사실을 알게 되었습니다.
  3. 운영체제 분기 처리: 자바 코드에서 운영체제를 감지한 뒤, 윈도우에서는 ‘tasklist’, macOS/리눅스에서는 ‘ps’를 사용하도록 분기 처리하는 로직을 새로 작성했습니다.
  4. 테스트와 검증: 실제로 윈도우, 맥, 리눅스 환경에서 각각 테스트를 진행하여, 모든 환경에서 게임 프로세스 감지 기능이 정상적으로 동작하는지 꼼꼼히 확인했습니다.

실제 적용 코드 예시

아래는 운영체제별로 명령어를 분기 처리하는 자바 코드의 핵심 부분입니다.

String os = System.getProperty("os.name").toLowerCase();
Process process;
if (os.contains("win")) {
    process = Runtime.getRuntime().exec("tasklist");
} else {
    process = Runtime.getRuntime().exec("ps -e");
}
// 이후 스트림을 읽어 프로세스 목록을 파싱

이렇게 분기 처리를 해주니, 윈도우 환경에서도 문제없이 프로세스 목록을 받아올 수 있었습니다.

자바에서 운영체제 분리 구현이란,,,

이번 경험을 통해, 실제 사용 환경을 꼼꼼히 고려하는 것이 얼마나 중요한지 다시 한 번 깨달았습니다. 개발자는 자신의 개발 환경에만 의존하지 말고, 다양한 운영체제와 상황을 염두에 두고 코드를 작성해야 한다는 점을 실감했습니다. 또한, 문제를 만났을 때 포기하지 않고 원인을 집요하게 파고드는 태도의 중요성도 다시 한 번 느꼈습니다.


이 글은 실제 개발 경험을 바탕으로 작성되었습니다. 추가적인 시행착오, 예외 처리, 그리고 더 복잡한 환경에서의 대응 방법 등은 추후 별도 포스팅에서 자세히 다룰 예정입니다.