pranshuparmar/witr
요약
witr는 프로세스, 포트, 컨테이너 등의 실행 인과관계를 추적하는 시스템 진단 도구입니다. 기존 도구들과 달리 실행 중인 대상이 어떤 체인을 통해 시작되었는지 명시적으로 보여줍니다.
핵심 포인트
- 프로세스, 포트, 컨테이너의 실행 원인(Causality)을 추적
- JSON 출력 및 대화형 TUI 대시보드 지원
- Linux, macOS, FreeBSD, Windows를 지원하는 단일 정적 바이너리
- 기존 ps, top, lsof 등의 도구가 제공하지 못하는 인과관계 시각화
모든 프로세스(process), 포트(port), 컨테이너(container), 또는 파일(file)을 그것을 시작한 정확한 체인(chain)으로 추적하세요 —
단 하나의 명령어, 기계 판독이 가능한 JSON, 또는 대화형 TUI로 가능합니다.
시뮬레이션된 Linux 환경을 조사해 보세요 — 설치가 필요 없는 가이드 튜토리얼 및 자유 플레이 샌드박스(sandbox)입니다.
목적 (Purpose) • 설치 (Installation) • TUI • 플래그 (Flags) • 핵심 개념 (Core Concept) • 예시 (Examples)
출력 동작 (Output Behavior) • 플랫폼 (Platforms) • 성공 기준 (Success Criteria) • 후원자 (Sponsors)
witr는 단 하나의 질문에 답하기 위해 존재합니다:
이것은 왜 실행 중인가?
시스템에서 프로세스(process), 서비스(service), 또는 포트(port)에 바인딩된 무언가가 실행 중일 때, 거기에는 항상 원인이 있습니다. 그 원인은 종종 간접적이거나, 명확하지 않거나, 또는 슈퍼바이저(supervisors), 컨테이너(containers), 서비스(services), 또는 셸(shells)과 같은 여러 계층에 걸쳐 퍼져 있습니다.
기존 도구들(ps, top, lsof, ss, systemctl, docker ps)은 상태(state)와 메타데이터(metadata)를 노출합니다. 이 도구들은 무엇이 실행 중인지는 보여주지만, 사용자가 여러 도구의 출력을 수동으로 상관 분석(correlating)하여 왜 실행 중인지를 추론하게 만듭니다.
witr는 그 인과관계(causality)를 명시적으로 만들어 줍니다.
witr는 실행 중인 대상이 어디에서 왔는지, 어떻게 시작되었는지, 그리고 현재 그것이 존재하게 된 책임이 있는 시스템 체인이 무엇인지를 단일한 인간 판독 가능(human-readable) 출력 또는 대화형 TUI 대시보드를 통해 설명합니다.
📖 witr가 어떻게 탄생했는지 궁금하신가요? 이야기를 읽어보거나 Hacker News 토론을 살펴보세요.
witr는 Linux, macOS, FreeBSD, 그리고 Windows를 위한 단일 정적 바이너리(static binary)로 배포됩니다.
witr는 또한 여러 운영 체제와 생태계에 걸쳐 독립적으로 패키징되어 유지 관리됩니다. 패키징 상태에 대한 최신 개요는 Repology에서 확인할 수 있습니다. 커뮤니티 패키지는 독립적인 검토 및 검증으로 인해 GitHub 릴리스보다 늦어질 수 있음을 유의하세요.
팁 (Tip)
패키지 관리자(Homebrew, Conda, Winget 등)를 사용하는 경우, 더 쉬운 업데이트를 위해 해당 관리자를 통해 설치하는 것을 권장합니다. 그렇지 않은 경우, 설치 스크립트(install script)가 시작하는 가장 빠른 방법입니다.
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
스크립트 상세 정보 (Script Details)
스크립트는 다음과 같은 작업을 수행합니다:
- 운영 체제 감지 (
linux,darwin또는freebsd) - CPU 아키텍처 감지 (
amd64또는arm64) - 최신 릴리스된 바이너리 (binary) 및 매뉴얼 페이지 (man page) 다운로드
/usr/local/bin/witr에 설치/usr/local/share/man/man1/witr.1에 매뉴얼 페이지 설치INSTALL_PREFIX를 전달하여 기본 설치 경로 재정의
irm https://raw.githubusercontent.com/pranshuparmar/witr/main/install.ps1 | iex
스크립트 상세 정보 (Script Details)
스크립트는 다음과 같은 작업을 수행합니다:
- 최신 릴리스 (zip)를 다운로드하고 체크섬 (checksum)을 검증합니다.
witr.exe를%LocalAppData%\witr\bin에 압축 해제합니다.- bin 디렉토리를 사용자
PATH에 추가합니다.
witr는 공식 Debian 및 Ubuntu 저장소 (Ubuntu 26.04+, Debian sid 및 이후 버전)뿐만 아니라 Kali Linux, Devuan, Raspbian과 같은 파생 배포판에서도 설치할 수 있습니다:
sudo apt install witr
참고: apt로 제공되는 버전은 GitHub의 최신 릴리스보다 뒤처질 수 있습니다. 최신 기능을 사용하려면 설치 스크립트나 다른 설치 방법을 사용하세요.
macOS, Linux 및 Windows에서 conda, mamba 또는 pixi를 사용하여 witr를 설치할 수 있습니다:
conda install -c conda-forge witr
# 또는 mamba 사용
mamba install -c conda-forge witr
...
Arch Linux 및 파생 배포판에서는 AUR 패키지에서 설치하십시오:
yay -S witr-bin
# 또는 paru 사용
paru -S witr-bin
...
FreeBSD에서는 FreshPorts 포트(port)를 통해 witr를 설치할 수 있습니다:
pkg install witr
# 또는
pkg install sysutils/witr
또는 Ports에서 빌드할 수 있습니다:
cd /usr/ports/sysutils/witr/
make install clean
aqua를 사용하여 witr를 설치할 수 있습니다:
# 패키지 추가
aqua g -i pranshuparmar/witr
# 패키지 설치
...
사전 빌드된 패키지 (deb, rpm, apk)
witr는 주요 Linux 배포판을 위한 네이티브 패키지를 제공합니다. GitHub 릴리스 페이지에서 최신 .deb, .rpm 또는 .apk 패키지를 다운로드할 수 있습니다.
curl을 사용한 일반적인 다운로드 명령
:# <실제 필요한 패키지 이름으로 <package name with the actual package that you need> 교체하세요> curl -LO https://github.com/pranshuparmar/witr/releases/latest/download/<package-name>
Debian/Ubuntu (.deb): sudo dpkg -i ./witr-*.deb # 또는, 의존성 해결을 위해 apt 사용: sudo apt install ./witr-*.deb
Fedora/RHEL/CentOS (.rpm): sudo rpm -i ./witr-*.rpm
Alpine Linux (.apk): sudo apk add --allow-untrusted ./witr-*.apk
Go (크로스 플랫폼 (cross-platform))
소스 코드로부터 직접 최신 버전을 설치할 수 있습니다:
go install github.com/pranshuparmar/witr/cmd/witr@latest
이렇게 하면 witr 바이너리가 $GOPATH/bin 또는 $HOME/go/bin 디렉토리에 배치됩니다. 이 디렉토리가 PATH에 포함되어 있는지 확인하세요.
수동 설치 (Manual Installation)
수동 설치를 선호하는 경우, 해당 플랫폼에 따라 다음의 간단한 단계를 따르세요:
Unix (Linux, macOS, FreeBSD)
# 1. OS 및 아키텍처 (Architecture) 결정
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
...
Windows (PowerShell)
# 1. 아키텍처 (Architecture) 결정
if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64") {
$ZipName = "witr-windows-amd64.zip"
...
Nix Flake
Nix를 사용하는 경우, 소스에서 witr를 빌드하여 설치 없이 실행할 수 있습니다:
nix run github:pranshuparmar/witr -- --help
설치 확인 (Verify Installation)
witr --version
man witr
셸 완성 (Shell Completions)
witr는 모든 플래그 (flags)에 대한 탭 완성 (tab completion)을 지원합니다. 이를 활성화하려면 셸 설정에 적절한 라인을 추가하세요:
Bash
echo 'eval "$(witr completion bash)"' >> ~/.bashrc
source ~/.bashrc
Zsh
echo 'eval "$(witr completion zsh)"' >> ~/.zshrc
source ~/.zshrc
Fish
witr completion fish | source
# 영구적으로 적용하려면:
witr completion fish > ~/.config/fish/completions/witr.fish
PowerShell
witr completion powershell | Out-String | Invoke-Expression
# 영구적으로 적용하려면, 위의 라인을 $PROFILE에 추가하세요
삭제 (Uninstallation)
패키지 관리자 (Homebrew, Conda 등)를 통해 설치했다면, 해당 삭제 명령어를 사용하세요 (예: brew uninstall witr).
witr의 스크립트/수동 설치를 완전히 제거하려면:
Unix (Linux, macOS, FreeBSD)
sudo rm -f /usr/local/bin/witr
sudo rm -f /usr/local/share/man/man1/witr.1
Windows
Remove-Item -Recurse -Force "$env:LocalAppData\witr"
인자 없이 witr을 실행하거나 -i 플래그를 사용하면 **대화형 모드 (Interactive Mode, TUI)**가 실행됩니다. 이는 프로세스, 포트, 컨테이너, 파일 잠금 (file locks)을 탐색할 수 있는 4개의 탭을 갖춘 실시간 터미널 기반 대시보드를 제공합니다.
프로세스 (Processes) 탭: 실행 중인 모든 프로세스의 실시간 정렬 및 필터링 가능한 목록을 제공하며, 사이드 패널을 통해 강조된 프로세스의 조상 트리 (ancestry tree)를 보여줍니다.
포트 (Ports) 탭: 열려 있거나 리스닝 (listening) 중인 포트를 보여주며, 사이드 패널에 해당 포트를 소유한 프로세스가 표시됩니다. a 키를 눌러 LISTEN 전용 모드와 전체 (ALL) 모드 사이를 전환할 수 있습니다.
컨테이너 (Containers) 탭: Docker, Podman, nerdctl, K8s/crictl, Incus, LXC, LXD 및 FreeBSD jails의 모든 실행 중인 컨테이너를 하나의 목록으로 보여줍니다. 이름, 이미지, 상태, 포트, 명령어를 확인할 수 있으며, 마운트 (mounts), 네트워크 (networks), compose 프로젝트 메타데이터를 포함한 컨테이너별 상세 보기 기능을 제공합니다.
잠금 (Locks) 탭: 시스템 전역 파일 잠금 (Linux의 POSIX/FLOCK, macOS/FreeBSD의 lsof 기반)을 보여줍니다. a를 눌러 "모든 열린 파일 (all open files)" 모드로 전환하면, 잠긴 항목들이 흥미로운 모든 열린 파일 디스크립터 (fd)와 병합됩니다. /를 입력하여...
병합된 세트 전체를 검색합니다. 프로세스 상세 정보 (Process Details): 프로세스의 전체 계보 트리 (ancestry tree), 자식 프로세스 (child processes), 환경 변수 (environment variables), 작업 디렉토리 (working directory), 소켓 (sockets), 파일 컨텍스트 (file context) 등을 심층적으로 조사합니다. 프로세스 작업 (Process Actions): UI에서 프로세스에 직접 신호 (Kill, Terminate, Pause, Resume)를 보내거나 우선순위 재설정 (Renice)을 수행합니다 (Unix 전용). 마우스 지원 (Mouse Support): 마우스를 사용하여 탐색, 열 정렬 및 행 클릭이 가능합니다. 적응형 테마 (Adaptive Theme): 색상이 터미널의 라이트 모드 및 다크 모드 배경에 따라 자동으로 조정됩니다. 자동 새로고침 (Auto-Refresh): 프로세스, 포트, 컨테이너 및 잠금 (lock) 목록이 적응형 주기(3초로 시작하여 부하가 증가하면 간격이 늘어남)에 따라 자동으로 새로고침됩니다.
-c, --container strings 조회할 컨테이너 (반복 가능)
--env 프로세스의 환경 변수 표시
-x, --exact 정확한 이름 일치 사용 (부분 문자열 검색 안 함)
...
위치 인자 (flags가 없는 인자)는 프로세스 또는 서비스 이름으로 취급됩니다. 여러 이름을 전달할 수 있습니다. 기본적으로 이름 매칭은 부분 문자열 매칭 (fuzzy search)을 사용합니다. 정확한 이름과 일치하는 프로세스만 매칭하려면 --exact를 사용하세요.
모든 대상 플래그 (--pid, --port, --file, --container)는 반복 사용이 가능하며, 서로 또는 위치 이름 인자와 혼합하여 사용할 수 있습니다. 여러 대상이 제공되면 결과는 레이블이 지정된 구분선과 함께 순차적으로 표시됩니다. 모든 출력 모드 (standard, short, tree, JSON, env, warnings, verbose)는 여러 입력값과 함께 작동합니다.
--container 플래그는 Docker, Podman, nerdctl, K8s/crictl, Incus, LXC, LXD 및 FreeBSD jails를 검색하며, 컨테이너 이름, 이미지, 명령(command), 그리고 compose 프로젝트/서비스 레이블과 매칭합니다.
인자가 없거나 관련 플래그 (--pid, --port, --file, --container)가 제공되지 않은 경우, 또는 --interactive 플래그가 명시적으로 사용된 경우 TUI가 실행됩니다.
witr은 모든 것을 프로세스에 대한 질문으로 취급합니다.
포트, 서비스, 컨테이너 및 명령은 결국 모두 PID로 매핑됩니다. 일단 PID가 식별되면, witr는 왜 해당 PID가 존재하는지를 설명하는 인과 관계 체인을 구축합니다.
그 핵심에서, witr는 다음 질문에 답합니다:
- 무엇이 실행 중인가?
- 어떻게 시작되었는가?
- 무엇이 그것을 계속 실행하게 만드는가?
- 어떤 컨텍스트 (Context)에 속해 있는가?
💡 직접 해보며 배우는 것을 선호하시나요? 대화형 브라우저 튜토리얼은 시뮬레이션된 박스 위에서 이러한 출력값들을 실시간으로 안내합니다. 설치 없이도 witr를 더 잘 느낄 수 있습니다.
witr node
Target : node
Process : node (pid 14233)
User : pm2
...
witr --port 5000 --short
systemd (pid 1) → PM2 v5.3.1: God (pid 1481580) → python (pid 1482060)
witr --pid 143895 --tree
systemd (pid 1)
└─ init-systemd(Ub (pid 2)
└─ SessionLeader (pid 143858)
...
참고: 트리 뷰 (Tree view)는 자식 프로세스(최대 10개)를 포함하며 대상 프로세스를 강조 표시합니다.
witr ng
Multiple matching processes found:
[1] nginx (pid 2311)
nginx -g daemon off;
...
부분 일치 (Substring matching)를 피하고 정확한 이름과 일치하는 프로세스만 찾으려면 --exact 플래그를 사용하세요:
witr nginx -x
witr --file /var/lib/dpkg/lock
파일을 열고 있는 프로세스를 설명합니다.
witr --container redis
감지된 모든 런타임 (Docker, Podman, nerdctl, K8s/crictl, Incus, LXC, LXD, FreeBSD jails)에 걸쳐 이름, 이미지, 명령 또는 compose 프로젝트/서비스를 통해 컨테이너를 조회합니다. 출력에 마운트 (Mounts), 네트워크 (Networks) 및 compose 메타데이터를 포함하려면 --verbose를 전달하세요.
witr nginx --port 5432 --pid 1234
----- [name: nginx] -----
Target : nginx
Process : nginx (pid 2311)
...
모든 대상 플래그는 반복 사용이 가능하며 혼합할 수 있습니다. 결과는 입력한 순서대로 나타납니다. 모든 출력 모드 (--short, --tree, --json, --env, --warnings, --verbose)는 여러 입력값과 함께 작동합니다.
- 기본적으로 단일 화면 (최선 수행)
- 결정론적 순서 (Deterministic ordering)
- 서사적 스타일 (Narrative-style)의 설명
- 명시적인 불확실성을 포함한 최선 수행 탐지
witr는 스크립트, CI 파이프라인 및 모니터링에서 사용할 수 있는 의미 있는 종료 코드 (Exit codes)를 반환합니다:
| 코드 | 의미 |
|---|---|
| 0 | Clean: 프로세스 발견, 경고 없음 |
| ... |
witr nginx --short
case $? in
0) echo "All clear" ;;
...
사용자가 질문한 내용.
실행 파일 (Executable), PID, 사용자 (user), 명령 (command), 시작 시간 (start time) 및 재시작 횟수 (restart count).
프로세스가 어떻게 생성되었는지를 보여주는 인과적 계보 체인 (causal ancestry chain). 이것이 witr의 핵심 가치입니다.
프로세스를 시작하거나 감독하는 데 책임을 지는 주요 시스템 (최선의 노력으로 탐색).
예시:
- 타이머 트리거 서비스에 대한 스케줄 정보가 포함된 systemd 유닛 (Linux)
- 스케줄/트리거 세부 정보가 포함된 launchd 서비스 (macOS)
- SSH 세션 (원격 IP 및 터미널 포함)
- docker 컨테이너
- pm2
- cron
- 대화형 쉘 (tmux/screen 세션 감지)
- Snap/Flatpak 샌드박스 (Linux)
오직 **하나의 주요 소스 (one primary source)**만 선택됩니다.
- 작업 디렉토리 (Working directory)
- Git 리포지토리 이름 및 브랜치 (branch)
- 컨테이너 이름 / 이미지 (docker, podman, kubernetes, colima, containerd)
- 퍼블릭(Public) vs 프라이빗(private) 바인딩 (bind)
다음과 같은 비차단형 관찰 (Non-blocking observations):
- 프로세스가 root 권한으로 실행 중
- root가 아닌 프로세스에서 위험한 Linux 기능 (capabilities) 사용 (CAP_SYS_ADMIN 등)
- 프로세스가 퍼블릭 인터페이스 (0.0.0.0 / ::)에서 리스닝 중
- 여러 번 재시작됨 (임계값 초과 시에만 경고)
- 프로세스가 높은 메모리 사용 중 (>1GB RSS)
- 프로세스가 90일 이상 실행 중
- 삭제된 바이너리 (Deleted binary), 라이브러리 주입 지표 (LD_PRELOAD, DYLD_*)
Linux(x86_64, arm64) - 전체 기능 지원 (/proc 사용).
macOS(x86_64, arm64) - ps, lsof, sysctl, pgrep 사용.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending All (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기