34P by GN⁺ 4일전 | ★ favorite | 댓글 1개
  • 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 바이너리 형태로 배포
  • 스크립트 설치(권장)
  • 수동 설치
    • 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 같은 유틸리티가 아주 유용함
  • 이 도구는 기존 모니터링/관찰 도구를 대체하려는 게 아님
    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 디렉터리를 찾는 방식임
      관련 코드 링크
  • 아이디어가 멋짐. 예전에 내가 만든 “whodis” alias는 포트를 연 PID를 찾는 용도였는데, 이건 훨씬 강력함

    • 고마움! PID 정보의 스위스 아미 나이프를 목표로 하고 있음
  • 정말 놀라운 도구임. 공유해줘서 고마움
    혹시 내가 AUR 패키지를 만들어도 괜찮을까?

    • 물론임! AUR 등록이라니 멋짐. 정말 감사함
    • 나는 작성자는 아니지만, AUR 버전이 생기면 정말 좋겠음
      Arch의 장점은 이런 흥미로운 도구들이 엄청 빠르게 AUR에 올라오는 것