38 pontos por GN⁺ 2025-12-27 | 1 comentários | Compartilhar no WhatsApp
  • Witr (why-is-this-running) é uma ferramenta que mostra com clareza por que um determinado processo, serviço ou porta está em execução em sistemas Linux
  • Ao contrário de ferramentas tradicionais como ps, top e lsof, que apenas mostram “o que está em execução”, ela exibe em uma única tela a relação causal do “por que está em execução”
  • Por meio de análise baseada em PID, rastreia a origem do processo, o caminho de execução, o motivo de ele continuar ativo e o contexto ao qual pertence
  • Explica a causa da execução em integração com várias fontes, como systemd, docker, pm2, cron e shell, e opera de forma somente leitura e não destrutiva
  • É uma ferramenta que reduz o tempo de entendimento durante depuração e resposta a incidentes, permitindo compreender de relance a estrutura de execução de sistemas complexos

Objetivo e conceito

  • A pergunta central do Witr é: “Por que isto está em execução? (why-is-this-running)”
    • Rastreia a origem e a causa de todos os itens em execução, como processos, serviços e portas
    • Mostra explicitamente causas indiretas de execução em várias camadas (supervisor, container, service, shell etc.)
  • Enquanto as ferramentas existentes fornecem apenas estado e metadados, o Witr expressa com clareza as relações causais
  • Como resultado, ele apresenta em formato fácil de ler “o que, como, por que e em que contexto está em execução”

Principais objetivos

  • Explicar a razão da existência de um processo, indo além de simplesmente informar se ele está em execução
  • Reduzir o tempo de depuração e resposta a incidentes
  • Pronto para uso sem configuração, com somente leitura e garantia de segurança
  • Prioriza clareza em vez de completude
  • Não inclui recursos de monitoramento, análise de desempenho nem recuperação automática

Como funciona

  • Interpreta todos os alvos com foco em processos (PID)
    • Portas, serviços, containers e comandos são todos conectados a PIDs
    • Com base no PID, constrói uma cadeia causal de execução (causal chain)
  • Quatro perguntas centrais
    1. O que está em execução
    2. Como foi iniciado
    3. O que o está mantendo em execução
    4. A que contexto pertence

Alvos suportados

  • Suporta nome de processo/serviço, PID e número de porta como entrada
    • Se vários processos corresponderem ao nome informado, solicita a escolha do PID
    • Também permite análise de um processo ou porta específicos com as opções --pid e --port

Estrutura da saída

  • Target: alvo especificado pelo usuário
  • Process: executável, PID, usuário, comando, horário de início, número de reinicializações
  • Why It Exists: linhagem causal (ancestry chain) do processo
  • Source: sistema principal responsável pela execução (por exemplo: systemd, docker, pm2, cron ou shell)
  • Context: diretório de trabalho, repositório Git, container Docker, informações de bind etc.
  • Warnings: avisos não bloqueantes, como execução com privilégio de root, escuta em interface pública, longa duração, uso excessivo de memória etc.

Opções de linha de comando

  • --pid, --port: analisam um PID ou porta específicos
  • --short: resumo em uma linha
  • --tree: mostra a árvore completa de processos
  • --json: saída em formato JSON
  • --warnings: mostra apenas avisos
  • --no-color: desativa cores
  • --env: mostra apenas variáveis de ambiente
  • --help: mostra a ajuda

Instalação e remoção

  • Distribuído como um único binário estático para Linux
  • Instalação por script (recomendada)
  • Instalação manual
    • Download direto dos binários para amd64 e arm64, com verificação de checksum
    • Após conceder permissão de execução, mova para o PATH
  • Verificação e remoção
    • Verifique com witr --version e man witr
    • Pode ser removido com sudo rm -f /usr/local/bin/witr
  • Suporte a Nix Flake: pode ser executado com nix run github:pranshuparmar/witr -- --port 5000

Plataforma e permissões

  • Exclusivo para Linux
  • Coleta informações por meio de acesso a /proc
    • Para verificar algumas informações de processos, pode ser necessário privilégio sudo

1 comentários

 
GN⁺ 2025-12-27
Comentários do Hacker News
  • Foi sugerido que o loop em GIF no README reinicia rápido demais, dificultando ler toda a saída
    Seria bom se ele ficasse parado por mais alguns segundos

    • Sinceramente, acho que capturas de tela são melhores do que GIFs
      Só o último quadro já transmite toda a informação necessária
    • Valeu pelo feedback! No começo pareceu ok, mas do ponto de vista do usuário era bem incômodo
      Já substituí por uma imagem estática e agradeço por todas as sugestões
    • Eu também acho que o GIF não é realmente necessário
      Ele mostra que o comando é rápido, mas o último quadro já contém tudo e a eficiência de banda também é pior
    • Na verdade, a solução mais simples é remover a animação por completo
      Basta deixá-la parada em 100% da tela de saída. Todo mundo já sabe como é digitar no terminal
    • Para gerar esse tipo de GIF automaticamente, utilitários como charmbracelet/vhs são muito úteis
  • Esta ferramenta não pretende substituir ferramentas existentes de monitoramento/observação
    A ideia é entender rapidamente “por que isso está rodando?” quando você acessa por SSH
    Estou disposto a ajustar a direção com base no feedback

    • Acho uma ideia realmente inteligente
      Sempre foi difícil descobrir a finalidade de um processo quando ele começa a consumir muitos recursos
      No início achei que também explicasse a função do processo em si, mas não é o caso
      Ainda assim, é uma ótima ferramenta. No futuro, seria legal expandir isso combinando páginas man + banco de dados de processos
  • Parece útil, mas no momento a saída mostra principalmente o ppid, então dá para saber “quem executou”, mas é difícil saber “por que foi executado”
    É bom que suporte vários formatos de saída. Pensando em ambientes automatizados, seria ainda melhor se JSON ou um formato amigável para grep fosse o padrão

    • Valeu pelo feedback! Estou analisando uma forma de mostrar com mais clareza a diferença entre “quem” e “por que”
      A saída padrão foi pensada para ser fácil de ler por humanos, mas a automação já é suportada com uma flag JSON
      Também vou pensar em um formato mais fácil de usar com grep
  • É uma ferramenta interessante, mas instalar binário via curl não me agrada
    Depois podem surgir questões como “como isso foi instalado?” ou “os patches de segurança estão atualizados?”
    Seria bom ter um pacote deb ou snap

    • Entendo que a instalação com curl não serve para todo mundo
      Como é a primeira release, comecei de forma simples, mas se ganhar popularidade pretendo fazer distribuição oficial em pacotes
    • Parece que em breve vai surgir um novo comando utilitário — wdtci: “what does this curl install?”
    • Como referência, o comando systemctl status $pid também pode fornecer bastante informação
  • A frase “witr é baseado em confiança” e a explicação de que foi desenvolvido com ajuda de AI/LLM parecem contraditórias

    • A frase “às vezes houve supervisão de um humano que sabia o que estava fazendo” parece uma piada, mas se for lida a sério passa insegurança
      Se os resultados do LLM forem revisados e o code review for feito de verdade, acho que dá para confiar
      Ainda assim, vejo com bons olhos o fato de terem sido transparentes sobre o uso de LLM
    • Sim, aquela frase foi escrita como humor, e o LLM teve apenas papel auxiliar
      As decisões reais foram tomadas por humanos
    • Para mim, se o código funciona bem, isso já basta
      Se o desenvolvimento foi orientado a resultados, acho ok
    • Ainda assim, continua sendo fácil para um malware falsificar relações entre processos
    • Sinceramente, acho que um LLM pode até entender melhor o contexto do que uma pessoa
  • Ferramenta realmente ótima e útil
    Mas em ambiente de produção, pelos motivos citados acima, é difícil usá-la de imediato
    Seria bom ter pacotes Debian ou RPM

    • Obrigado! Como é a primeira release, comecei de forma simples, mas se ficar popular vou preparar pacotes oficiais
  • Para compilar direto do código-fonte, basta usar o comando abaixo

    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
    

    Pessoalmente, se existe um install.sh, espero que ele priorize a instalação a partir do código-fonte local
    É esse tipo de ferramenta simples que me faz continuar no terminal

    • Valeu! Graças ao @sestep, já foi adicionado suporte a Nix, então não há preocupação com binários
    • Ou então é só usar o Nix PR
  • Fiquei curioso sobre o significado de “Git repository name and branch”
    É uma funcionalidade para detectar se o processo em execução foi iniciado dentro de um repositório Git?

  • A ideia é ótima. Um tempo atrás eu criei um alias “whodis” para encontrar o PID que abriu uma porta, mas isso aqui é muito mais poderoso

    • Obrigado! O objetivo é ser um canivete suíço das informações de PID
  • Ferramenta realmente impressionante. Obrigado por compartilhar
    Será que eu poderia criar um pacote AUR?

    • Claro! Seria incrível ter isso no AUR. Muito obrigado
    • Eu não sou o autor, mas adoraria ver uma versão AUR
      Uma das vantagens do Arch é que ferramentas interessantes como essa aparecem no AUR muito rapidamente