문제: 당신의 CPU는 도대체 무엇을 실행하고 있나요?

노트북 팬이 미친 듯이 돌고 배터리가 빠르게 소모되지만, 범인이 누군지 모릅니다. Activity Monitor나 Task Manager를 열면 프로세스 이름들만 보이고, 근본적인 질문에는 답할 수 없습니다:

“Why is this running?”

  • 이 프로세스는 누가 시작했나요?
  • 왜 아직 실행 중인가요?
  • 어떤 포트를 점유하고 있나요?
  • 하위 프로세스는 무엇인가요?
  • 종료하면 다른 것에 영향을 미치나요?

기존 도구(htop, top, ps)는 스냅샷만 제공하고 계보는 제공하지 않습니다.

Witr란 무엇인가?

Witr (“Why is this running?")는 Go로 작성된 오픈소스 프로세스 분석 도구입니다. GitHub에서 15,042+ Stars를 보유하고 있으며, 모든 시스템 관리자와 개발자가 가장 궁금해하는 질문에 답합니다.

Witr의 핵심 기능: 프로세스의 완전한 인과 관계 체인을 보여줍니다 — init 시스템부터 대상 프로세스까지, “누가 누구를 낳았는지"를 완전히 보여주는 가족 트리입니다.

핵심 기능

1. 프로세스 계보 트리(Process Ancestry)

Witr의 킬러 기능입니다. witr <PID>를 실행하면:

init(1)
└── systemd(1234)
    └── dockerd(5678)
        └── containerd-shim(9012)
            └── node(3456) ← Your App
                ├── npm(7890)
                └── webpack-dev-server(2345)

한눈에 보기: 이 Node.js 프로세스는 Docker 컨테이너 안에 있고, systemd에 의해 시작되었으며, webpack-dev-server는 그 하위 프로세스입니다.

2. 인터랙티브 TUI 모드

Witr는 단순한 명령줄 출력이 아니라 완전한 터미널 사용자 인터페이스를 갖추고 있습니다:

기능단축키설명
실시간 프로세스 목록↑↓모든 실행 중인 프로세스, 정렬 및 필터링 지원
포트 뷰p열린 포트와 해당 프로세스 즉시 확인
프로세스 상세 정보Enter완전한 계보 트리, 하위 프로세스, 환경 변수, 작업 디렉토리
신호 전송kKill, Terminate, Pause, Resume
우선순위 조정rRenice 프로세스
마우스 지원🖱️정렬, 행 선택 클릭

3. 포트 뷰

$ witr --ports

PORT    PROTO   PROCESS         PID    USER
8080    TCP     node            3456   ubuntu
3000    TCP     webpack-dev     2345   ubuntu
5432    TCP     postgres        5678   postgres
22      TCP     sshd            1234   root

누가 어떤 포트를 수신 대기하는지 한눈에 파악, 더 이상 lsof -i :8080이 필요 없습니다.

4. 환경 변수 및 작업 디렉토리

$ witr 3456 --env

PID: 3456
Command: node server.js
Working Directory: /home/ubuntu/myapp

Environment Variables:
NODE_ENV=production
PORT=8080
DATABASE_URL=postgresql://...
API_KEY=sk-***

구성 문제 디버깅의 신기 — 프로세스가 실제로 실행되는 환경을 직접 확인합니다.

5. 신호 전송

TUI에서 직접 신호를 보냅니다:

  • SIGKILL (9) — 강제 종료
  • SIGTERM (15) — 우아한 종료
  • SIGSTOP (19) — 일시 중지
  • SIGCONT (18) — 재개

kill -9 PID를 외울 필요 없이, k를 누르고 선택하면 됩니다.

설치

원클릭 설치

# macOS / Linux
curl -fsSL https://github.com/pranshuparmar/witr/releases/latest/download/witr-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') -o witr
chmod +x witr
sudo mv witr /usr/local/bin/

# Go 설치
go install github.com/pranshuparmar/witr/cmd/witr@latest

지원 플랫폼

  • ✅ Linux
  • ✅ macOS
  • ✅ Windows
  • ✅ FreeBSD

사용 예시

기본 사용법

# 인터랙티브 TUI 시작
witr

# 특정 프로세스의 계보 트리 확인
witr 3456

# 포트 점유 확인
witr --ports

# 프로세스 환경 변수 확인
witr 3456 --env

# 지속 모니터링 모드
witr --watch

실제 시나리오

시나리오 1: 배터리 소모 범인 찾기

$ witr
# CPU로 정렬, node 프로세스가 80% 차지
# Enter로 상세 정보 확인: webpack-dev-server
# k → SIGTERM → 우아하게 종료

시나리오 2: 포트 충돌

$ witr --ports
# 8080이 점유된 것 발견
# 프로세스 확인: 어제 남겨진 테스트 서버
# k → SIGKILL → 포트 해제

시나리오 3: 컨테이너 디버깅

$ witr $(docker inspect -f '{{.State.Pid}}' mycontainer)
# 컨테이너 내 프로세스의 계보 트리 확인
# 환경 변수, 작업 디렉토리 한눈에 보기

유사 도구 비교

기능Witrhtoppslsof
프로세스 계보 트리✅ 완전❌ 없음❌ 없음❌ 없음
인터랙티브 TUI✅ 예✅ 예❌ 아니오❌ 아니오
포트 뷰✅ 내장❌ 없음❌ 없음✅ 예
환경 변수✅ 원클릭❌ 없음⚠️ 복잡❌ 없음
신호 전송✅ 인터랙티브⚠️ 제한적❌ 없음❌ 없음
마우스 지원✅ 예✅ 예❌ 아니오❌ 아니오
크로스 플랫폼✅ 4개 플랫폼✅ 다중 플랫폼✅ 범용✅ 다중 플랫폼

아키텍처

Witr는 Go로 작성되었으며 운영 체제 기본 API를 활용합니다:

  • Linux: /proc 파일 시스템
  • macOS: libproc + sysctl
  • Windows: Windows API
  • FreeBSD: kvm + sysctl

순수 Go 구현, CGO 의존성 없음(Windows 제외), 단일 바이너리 파일, 제로 의존성.

결론

Witr는 htop의 대체품이 아니라 프로세스 디버깅 전용 도구입니다. “Why is this running?“이라는 질문에 답해야 할 때, Witr는 어떤 도구보다 빠릅니다.

  • 15K+ Stars는 실제 문제를 해결했음을 증명합니다
  • 단일 바이너리 파일, 어디서든 사용 가능
  • TUI 경험이 부드럽고, 마우스와 키보드 모두 지원

GitHub: pranshuparmar/witr
Stars: 15,042+ | Language: Go | License: 오픈소스

관련 기사