Witr - 리눅스 시스템에서 프로세스가 실행 중인 이유를 설명하는 도구
(github.com/pranshuparmar)- Witr (why-is-this-running) 는 리눅스 시스템에서 특정 프로세스, 서비스, 또는 포트가 왜 실행 중인지를 명확히 보여주는 도구
- 기존
ps,top,lsof등이 단순히 “무엇이 실행 중인지”만 보여주는 것과 달리, “왜 실행 중인지”의 인과 관계를 한 화면에 표시 - PID 기반 분석을 통해 프로세스의 기원, 실행 경로, 유지 원인, 소속 컨텍스트를 추적
- systemd, docker, pm2, cron, shell 등 다양한 소스와 연계해 실행 원인을 설명하며, 읽기 전용·비파괴적으로 동작
- 디버깅과 장애 대응 시 이해 시간을 단축하고, 복잡한 시스템의 실행 구조를 한눈에 파악할 수 있는 도구
목적과 개념
-
Witr의 핵심 질문은 “왜 이것이 실행 중인가? (why-is-this-running)”임
- 프로세스, 서비스, 포트 등 실행 중인 모든 항목의 기원과 원인을 추적
- 여러 계층(supervisor, container, service, shell 등)에 걸친 간접적 실행 원인을 명시적으로 보여줌
- 기존 도구들이 상태와 메타데이터만 제공하는 반면, Witr는 인과 관계를 명확히 표현
- 결과적으로 “무엇이, 어떻게, 왜, 어떤 맥락에서 실행 중인지”를 사람이 읽기 쉬운 형태로 출력
주요 목표
- 프로세스 존재 이유를 설명하고, 단순 실행 여부 이상의 정보를 제공
- 디버깅 및 장애 대응 시간 단축
- 설정 없이 바로 사용 가능, 읽기 전용·안전성 보장
- 완전성보다 명확성을 우선
- 모니터링, 성능 분석, 자동 복구 기능은 포함하지 않음
작동 원리
- 모든 대상을 프로세스(PID) 중심으로 해석
- 포트, 서비스, 컨테이너, 명령어 모두 PID로 연결
- PID를 기준으로 실행 인과 체인(causal chain) 을 구성
- 핵심 질문 네 가지
- 무엇이 실행 중인가
- 어떻게 시작되었는가
- 무엇이 유지시키고 있는가
- 어떤 컨텍스트에 속하는가
지원 대상
-
프로세스/서비스 이름, PID, 포트 번호를 입력 대상으로 지원
- 이름 입력 시 여러 프로세스가 일치하면 PID 선택을 요청
-
--pid,--port옵션으로 특정 프로세스나 포트 기반 분석 가능
출력 구조
- Target: 사용자가 지정한 대상
- Process: 실행 파일, PID, 사용자, 명령어, 시작 시각, 재시작 횟수
- Why It Exists: 프로세스의 인과 계보(ancestry chain)
- Source: 실행을 담당한 주요 시스템 (예: systemd, docker, pm2, cron, shell 중 하나)
- Context: 작업 디렉터리, Git 저장소, Docker 컨테이너, 바인드 정보 등
- Warnings: 루트 권한 실행, 공용 인터페이스 리스닝, 장기 실행, 메모리 과다 사용 등 비차단 경고
명령줄 옵션
-
--pid,--port: 특정 PID 또는 포트 분석 -
--short: 한 줄 요약 -
--tree: 전체 프로세스 트리 표시 -
--json: JSON 형식 출력 -
--warnings: 경고만 표시 -
--no-color: 색상 비활성화 -
--env: 환경 변수만 표시 -
--help: 도움말 표시
설치 및 제거
- 단일 정적 Linux 바이너리 형태로 배포
-
스크립트 설치(권장)
-
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash - CPU 아키텍처 자동 감지 후
/usr/local/bin/witr에 설치
-
-
수동 설치
-
amd64,arm64용 바이너리 직접 다운로드 및 체크섬 검증 - 실행 권한 부여 후 PATH에 이동
-
-
검증 및 제거
-
witr --version,man witr로 확인 -
sudo rm -f /usr/local/bin/witr로 제거 가능
-
-
Nix Flake 지원:
nix run github:pranshuparmar/witr -- --port 5000으로 실행 가능
플랫폼 및 권한
- Linux 전용
-
/proc접근을 통해 정보 수집- 일부 프로세스 정보 확인에는 sudo 권한 필요
Hacker News 의견들
-
README에 있는 GIF 루프가 너무 빨리 재시작되어 출력 내용을 다 읽기 어렵다는 점을 제안함
몇 초 정도 더 멈춰 있으면 좋겠음- 솔직히 말해 GIF보다는 스크린샷이 더 낫다고 생각함
마지막 프레임만 봐도 필요한 정보는 다 전달됨 - 피드백 고마움! 처음엔 괜찮아 보였는데 사용자 입장에서 보니 꽤 불편했음
이미 정적 이미지로 교체했으며, 제안해준 의견들 모두 감사함 - 나도 GIF는 굳이 필요 없다고 생각함
명령이 빠르다는 걸 보여주긴 하지만, 마지막 프레임에 이미 다 담겨 있고 대역폭 효율도 떨어짐 - 사실 가장 간단한 해결책은 애니메이션을 아예 없애는 것임
출력 화면에서 100% 멈춰 있게 하면 됨. 터미널에 타이핑하는 모습은 이미 다들 알고 있음 - 이런 GIF를 자동으로 만들기엔 charmbracelet/vhs 같은 유틸리티가 아주 유용함
- 솔직히 말해 GIF보다는 스크린샷이 더 낫다고 생각함
-
이 도구는 기존 모니터링/관찰 도구를 대체하려는 게 아님
SSH로 접속했을 때 “이게 왜 실행 중이지?”를 빠르게 파악하려는 용도임
피드백에 따라 방향을 조정할 의향이 있음- 정말 영리한 아이디어라고 생각함
어떤 프로세스가 리소스를 많이 쓰기 시작했을 때 그 목적을 알아내는 게 늘 어려웠음
처음엔 프로세스의 기능까지 설명해주는 줄 알았는데, 그건 아니었음
그래도 멋진 도구임. 나중엔 Man 페이지 + 프로세스 DB를 결합해 확장형으로 만들어도 좋을 듯함
- 정말 영리한 아이디어라고 생각함
-
유용해 보이지만, 현재 출력은 대부분 ppid만 보여줘서 “누가 실행했는가”는 알 수 있지만 “왜 실행됐는가”는 알기 어려움
여러 출력 포맷을 지원하는 건 좋음. 자동화 환경을 고려해 JSON이나 grep-friendly 포맷을 기본값으로 두면 더 좋겠음- 피드백 고마움! “누가”와 “왜”를 더 명확히 구분해 보여주는 방향을 검토 중임
기본 출력은 사람이 보기 쉽게 설계했지만, JSON 플래그로 자동화도 이미 지원함
좀 더 쉽게 grep할 수 있는 형태도 고민해보겠음
- 피드백 고마움! “누가”와 “왜”를 더 명확히 구분해 보여주는 방향을 검토 중임
-
흥미로운 도구지만
curl로 바이너리 설치하는 건 꺼려짐
나중에 “이게 어떻게 설치됐지?” “보안 패치는 최신인가?” 같은 문제가 생길 수 있음
deb 패키지나 snap이 생기면 좋겠음-
curl설치가 모두에게 맞진 않다는 점 이해함
첫 릴리스라 단순하게 시작했지만, 인기가 생기면 공식 패키지 배포를 계획할 예정임 - 곧 새로운 유틸리티 명령이 나올 듯함 —
wdtci: “what does this curl install?” - 참고로
systemctl status $pid명령으로도 많은 정보를 얻을 수 있음
-
-
“witr는 신뢰를 기반으로 한다”는 문장과 “AI/LLM의 도움을 받아 개발됐다”는 설명이 모순적으로 느껴짐
- “가끔은 뭘 하는지 아는 인간이 감독했다”는 문장은 농담처럼 보이지만, 진지하게 읽히면 불안함
LLM의 결과를 검토하고 코드 리뷰를 제대로 한다면 신뢰할 수 있을 것 같음
그래도 LLM 사용을 투명하게 공개한 점은 좋게 봄 - 맞음, 그 문장은 유머로 쓴 것이고 LLM은 보조 역할일 뿐임
실제 결정은 사람이 내렸음 - 나로서는 코드가 잘 작동하면 충분함
결과 중심으로 개발했다면 괜찮다고 생각함 - 다만 악성코드가 프로세스 관계를 위조하는 건 여전히 쉬운 일임
- 솔직히 LLM이 사람보다 상황을 더 잘 이해할 수도 있다고 생각함
- “가끔은 뭘 하는지 아는 인간이 감독했다”는 문장은 농담처럼 보이지만, 진지하게 읽히면 불안함
-
정말 멋지고 유용한 도구임
하지만 프로덕션 환경에서는 위에서 언급된 이유로 바로 쓰긴 어려움
Debian이나 RPM 패키지가 생기면 좋겠음- 고마움! 첫 릴리스라 단순하게 시작했지만, 인기가 생기면 정식 패키지를 준비할 예정임
-
소스에서 직접 빌드하려면 다음 명령을 사용하면 됨
CGO_ENABLED=0 go build -ldflags "-X main.version=dev -X main.commit=$(git rev-parse --short HEAD) -X 'main.buildDate=$(date +%Y-%m-%d)'" -o witr ./cmd/witr개인적으로는
install.sh가 있다면 로컬 소스 우선 설치를 기대함
이런 단순한 도구들이 터미널에 계속 머물게 만드는 이유임- 고마움! @sestep 덕분에 이미 Nix 지원이 추가되어 바이너리 걱정은 없음
- 아니면 그냥 Nix PR을 사용해도 됨
-
“Git repository name and branch”가 의미하는 게 궁금함
실행 중인 프로세스가 Git 저장소 내부에서 실행됐는지 감지하는 기능인가?- 맞음, 프로세스의 작업 디렉터리에서 상위로 올라가며 .git 디렉터리를 찾는 방식임
관련 코드 링크
- 맞음, 프로세스의 작업 디렉터리에서 상위로 올라가며 .git 디렉터리를 찾는 방식임
-
아이디어가 멋짐. 예전에 내가 만든 “whodis” alias는 포트를 연 PID를 찾는 용도였는데, 이건 훨씬 강력함
- 고마움! PID 정보의 스위스 아미 나이프를 목표로 하고 있음
-
정말 놀라운 도구임. 공유해줘서 고마움
혹시 내가 AUR 패키지를 만들어도 괜찮을까?- 물론임! AUR 등록이라니 멋짐. 정말 감사함
- 나는 작성자는 아니지만, AUR 버전이 생기면 정말 좋겠음
Arch의 장점은 이런 흥미로운 도구들이 엄청 빠르게 AUR에 올라오는 것임