# Witr - 리눅스 시스템에서 프로세스가 실행 중인 이유를 설명하는 도구

> Clean Markdown view of GeekNews topic #25376. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25376](https://news.hada.io/topic?id=25376)
- GeekNews Markdown: [https://news.hada.io/topic/25376.md](https://news.hada.io/topic/25376.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-12-27T21:32:55+09:00
- Updated: 2025-12-27T21:32:55+09:00
- Original source: [github.com/pranshuparmar](https://github.com/pranshuparmar/witr)
- Points: 38
- Comments: 1

## Summary

**Witr**는 리눅스 시스템에서 특정 프로세스나 포트가 **‘왜 실행 중인지’**를 인과적으로 설명하는 도구입니다. 단순히 실행 상태를 나열하는 기존 `ps`나 `top`과 달리, **PID 기반 인과 체인**을 구성해 프로세스의 기원·유지 원인·컨텍스트를 한눈에 보여줍니다. systemd, docker, cron 등 다양한 실행 소스를 추적하며, 읽기 전용으로 동작해 안전하게 디버깅과 장애 원인 분석 시간을 줄여줍니다.

## Topic Body

- **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)** 을 구성  
- 핵심 질문 네 가지  
  1. 무엇이 실행 중인가  
  2. 어떻게 시작되었는가  
  3. 무엇이 유지시키고 있는가  
  4. 어떤 컨텍스트에 속하는가  
  
### 지원 대상  
- **프로세스/서비스 이름**, **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 권한 필요**

## Comments



### Comment 48328

- Author: neo
- Created: 2025-12-27T21:32:55+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=46392910) 
- README에 있는 **GIF 루프**가 너무 빨리 재시작되어 출력 내용을 다 읽기 어렵다는 점을 제안함  
  몇 초 정도 더 멈춰 있으면 좋겠음
  - 솔직히 말해 GIF보다는 **스크린샷**이 더 낫다고 생각함  
    마지막 프레임만 봐도 필요한 정보는 다 전달됨
  - 피드백 고마움! 처음엔 괜찮아 보였는데 사용자 입장에서 보니 꽤 불편했음  
    이미 **정적 이미지**로 교체했으며, 제안해준 의견들 모두 감사함
  - 나도 GIF는 굳이 필요 없다고 생각함  
    명령이 빠르다는 걸 보여주긴 하지만, 마지막 프레임에 이미 다 담겨 있고 **대역폭 효율**도 떨어짐
  - 사실 가장 간단한 해결책은 **애니메이션을 아예 없애는 것**임  
    출력 화면에서 100% 멈춰 있게 하면 됨. 터미널에 타이핑하는 모습은 이미 다들 알고 있음
  - 이런 GIF를 자동으로 만들기엔 [charmbracelet/vhs](https://github.com/charmbracelet/vhs) 같은 유틸리티가 아주 유용함

- 이 도구는 기존 **모니터링/관찰 도구를 대체**하려는 게 아님  
  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](https://github.com/pranshuparmar/witr/pull/5)을 사용해도 됨

- “Git repository name and branch”가 의미하는 게 궁금함  
  실행 중인 프로세스가 **Git 저장소 내부에서 실행됐는지** 감지하는 기능인가?
  - 맞음, 프로세스의 작업 디렉터리에서 상위로 올라가며 **.git 디렉터리**를 찾는 방식임  
    [관련 코드 링크](https://github.com/pranshuparmar/witr/blob/1e47bdb8fde179b178aa2f81bf6502c5cd8be094/internal/linux/proc/process.go#L74-L90)

- 아이디어가 멋짐. 예전에 내가 만든 **“whodis” alias**는 포트를 연 PID를 찾는 용도였는데, 이건 훨씬 강력함
  - 고마움! **PID 정보의 스위스 아미 나이프**를 목표로 하고 있음

- 정말 놀라운 도구임. 공유해줘서 고마움  
  혹시 내가 **AUR 패키지**를 만들어도 괜찮을까?
  - 물론임! AUR 등록이라니 멋짐. 정말 감사함
  - 나는 작성자는 아니지만, **AUR 버전**이 생기면 정말 좋겠음  
    Arch의 장점은 이런 흥미로운 도구들이 **엄청 빠르게 AUR에 올라오는 것**임
