38 điểm bởi GN⁺ 2025-12-27 | 1 bình luận | Chia sẻ qua WhatsApp
  • Witr (why-is-this-running) là công cụ cho thấy rõ vì sao một tiến trình, dịch vụ hoặc cổng cụ thể đang chạy trên hệ thống Linux
  • Khác với ps, top, lsof hiện có vốn chỉ cho biết đơn thuần “điều gì đang chạy”, công cụ này hiển thị quan hệ nhân quả của câu hỏi “vì sao nó đang chạy” trên cùng một màn hình
  • Thông qua phân tích dựa trên PID, công cụ lần theo nguồn gốc của tiến trình, đường dẫn thực thi, lý do duy trì và ngữ cảnh mà nó thuộc về
  • Giải thích nguyên nhân thực thi bằng cách liên kết với nhiều nguồn khác nhau như systemd, docker, pm2, cron, shell, đồng thời hoạt động theo kiểu chỉ đọc, không phá hủy
  • Là công cụ giúp rút ngắn thời gian tìm hiểu khi gỡ lỗi và ứng phó sự cố, đồng thời nắm bắt cấu trúc vận hành của các hệ thống phức tạp trong nháy mắt

Mục đích và khái niệm

  • Câu hỏi cốt lõi của Witr là “vì sao cái này đang chạy? (why-is-this-running)”
    • Theo dõi nguồn gốc và nguyên nhân của mọi đối tượng đang chạy như tiến trình, dịch vụ, cổng
    • Hiển thị tường minh nguyên nhân chạy gián tiếp trải dài qua nhiều lớp như supervisor, container, service, shell
  • Trong khi các công cụ hiện có chỉ cung cấp trạng thái và metadata, Witr diễn đạt rõ ràng mối quan hệ nhân quả
  • Kết quả là công cụ xuất ra theo dạng dễ đọc với con người để trả lời “cái gì, bằng cách nào, vì sao, và trong ngữ cảnh nào đang chạy”

Mục tiêu chính

  • Giải thích lý do tồn tại của tiến trình, cung cấp thông tin vượt lên trên việc chỉ biết có đang chạy hay không
  • Rút ngắn thời gian gỡ lỗi và ứng phó sự cố
  • Dùng ngay không cần cấu hình, chỉ đọc và bảo đảm an toàn
  • Ưu tiên độ rõ ràng hơn độ đầy đủ tuyệt đối
  • Không bao gồm các tính năng giám sát, phân tích hiệu năng hay tự động phục hồi

Cách hoạt động

  • Mọi đối tượng đều được diễn giải xoay quanh tiến trình (PID)
    • Cổng, dịch vụ, container, lệnh đều được liên kết về PID
    • Dựa trên PID để xây dựng chuỗi nhân quả thực thi (causal chain)
  • Bốn câu hỏi cốt lõi
    1. Điều gì đang chạy
    2. Nó được khởi động như thế nào
    3. Điều gì đang duy trì nó
    4. Nó thuộc về ngữ cảnh nào

Đối tượng hỗ trợ

  • Hỗ trợ nhập tên tiến trình/dịch vụ, PID, số cổng làm đối tượng phân tích
    • Khi nhập tên, nếu có nhiều tiến trình khớp thì sẽ yêu cầu chọn PID
    • Có thể phân tích dựa trên tiến trình hoặc cổng cụ thể bằng các tùy chọn --pid, --port

Cấu trúc đầu ra

  • Target: đối tượng do người dùng chỉ định
  • Process: tệp thực thi, PID, người dùng, lệnh, thời điểm bắt đầu, số lần khởi động lại
  • Why It Exists: chuỗi tổ tiên nhân quả (ancestry chain) của tiến trình
  • Source: hệ thống chính chịu trách nhiệm khởi chạy (ví dụ: một trong systemd, docker, pm2, cron, shell)
  • Context: thư mục làm việc, kho Git, container Docker, thông tin bind, v.v.
  • Warnings: các cảnh báo không chặn như chạy với quyền root, lắng nghe trên giao diện công cộng, chạy quá lâu, dùng quá nhiều bộ nhớ, v.v.

Tùy chọn dòng lệnh

  • --pid, --port: phân tích PID hoặc cổng cụ thể
  • --short: tóm tắt một dòng
  • --tree: hiển thị toàn bộ cây tiến trình
  • --json: xuất theo định dạng JSON
  • --warnings: chỉ hiển thị cảnh báo
  • --no-color: tắt màu
  • --env: chỉ hiển thị biến môi trường
  • --help: hiển thị trợ giúp

Cài đặt và gỡ bỏ

  • Được phân phối dưới dạng một tệp nhị phân Linux tĩnh duy nhất
  • Cài đặt bằng script (khuyến nghị)
  • Cài đặt thủ công
    • Tải trực tiếp tệp nhị phân cho amd64, arm64 và kiểm tra checksum
    • Cấp quyền thực thi rồi chuyển vào PATH
  • Xác minh và gỡ bỏ
    • Kiểm tra bằng witr --version, man witr
    • Có thể gỡ bằng sudo rm -f /usr/local/bin/witr
  • Hỗ trợ Nix Flake: có thể chạy bằng nix run github:pranshuparmar/witr -- --port 5000

Nền tảng và quyền hạn

  • Chỉ dành cho Linux
  • Thu thập thông tin thông qua truy cập /proc
    • Để xem thông tin của một số tiến trình, cần quyền sudo

1 bình luận

 
GN⁺ 2025-12-27
Ý kiến trên Hacker News
  • Có ý kiến cho rằng GIF lặp trong README khởi động lại quá nhanh nên khó đọc hết nội dung đầu ra
    Sẽ tốt hơn nếu nó dừng thêm vài giây

    • Thành thật mà nói, tôi nghĩ ảnh chụp màn hình còn tốt hơn GIF
      Chỉ cần nhìn khung hình cuối là đã truyền tải đủ thông tin cần thiết
    • Cảm ơn góp ý! Ban đầu trông có vẻ ổn, nhưng nhìn từ góc độ người dùng thì đúng là khá bất tiện
      Tôi đã thay bằng ảnh tĩnh, và rất cảm ơn tất cả các đề xuất
    • Tôi cũng nghĩ GIF là không thực sự cần thiết
      Nó cho thấy lệnh chạy nhanh, nhưng mọi thứ đã có hết ở khung hình cuối, mà hiệu quả băng thông cũng kém
    • Thực ra cách đơn giản nhất là bỏ hẳn hoạt ảnh
      Chỉ cần để nó đứng yên 100% ở màn hình kết quả là được. Ai cũng đã biết cảnh gõ lệnh trong terminal trông như thế nào
    • Để tự động tạo các GIF kiểu này, những tiện ích như charmbracelet/vhs rất hữu ích
  • Công cụ này không nhằm thay thế các công cụ giám sát/quan sát hiện có
    Nó dùng để nhanh chóng hiểu “tại sao cái này lại đang chạy?” khi SSH vào máy
    Tôi sẵn sàng điều chỉnh định hướng dựa trên phản hồi

    • Tôi nghĩ đây là một ý tưởng rất thông minh
      Mỗi khi có tiến trình bắt đầu dùng nhiều tài nguyên, việc tìm ra mục đích của nó luôn rất khó
      Ban đầu tôi tưởng nó còn giải thích cả chức năng của tiến trình, nhưng không phải vậy
      Dù sao đây vẫn là một công cụ tuyệt vời. Về sau có thể mở rộng bằng cách kết hợp trang Man + cơ sở dữ liệu tiến trình
  • Trông khá hữu ích, nhưng hiện tại đầu ra chủ yếu chỉ cho thấy ppid, nên có thể biết “ai đã chạy nó” nhưng vẫn khó biết “vì sao nó được chạy”
    Hỗ trợ nhiều định dạng đầu ra là tốt. Nếu tính đến môi trường tự động hóa thì sẽ hay hơn nếu mặc định là JSON hoặc định dạng thân thiện với grep

    • Cảm ơn phản hồi! Tôi đang xem xét cách thể hiện rõ ràng hơn sự khác biệt giữa “ai” và “vì sao”
      Đầu ra mặc định được thiết kế để con người dễ đọc, nhưng việc tự động hóa đã được hỗ trợ sẵn qua cờ JSON
      Tôi cũng sẽ nghĩ thêm về dạng dễ grep hơn
  • Là công cụ thú vị, nhưng tôi ngại chuyện cài binary bằng curl
    Sau này có thể nảy sinh các câu hỏi như “cái này được cài như thế nào vậy?” hay “bản vá bảo mật đã mới nhất chưa?”
    Sẽ tốt hơn nếu có gói deb hoặc snap

    • Tôi hiểu việc cài bằng curl không phù hợp với tất cả mọi người
      Vì là bản phát hành đầu tiên nên tôi bắt đầu thật đơn giản, nhưng nếu nó được đón nhận, tôi dự định sẽ phát hành gói chính thức
    • Có vẻ sắp xuất hiện một lệnh tiện ích mới — wdtci: “what does this curl install?”
    • Nhân tiện, lệnh systemctl status $pid cũng có thể cung cấp khá nhiều thông tin
  • Câu “witr được xây dựng trên sự tin cậy” và phần mô tả rằng nó được phát triển với sự trợ giúp của AI/LLM nghe có vẻ mâu thuẫn

    • Câu “thỉnh thoảng có con người biết mình đang làm gì giám sát” có vẻ là một câu đùa, nhưng nếu đọc nghiêm túc thì lại gây bất an
      Nếu kết quả từ LLM được rà soát và code review cẩn thận thì có lẽ vẫn đáng tin
      Dù vậy, tôi đánh giá cao việc công khai minh bạch chuyện dùng LLM
    • Đúng vậy, câu đó được viết như một trò đùa, và LLM chỉ đóng vai trò hỗ trợ
      Các quyết định thực tế đều do con người đưa ra
    • Với tôi thì chỉ cần code chạy tốt là đủ
      Nếu phát triển theo hướng chú trọng kết quả thì tôi thấy ổn
    • Tuy vậy, mã độc vẫn có thể giả mạo quan hệ giữa các tiến trình một cách khá dễ dàng
    • Thành thật mà nói, tôi nghĩ LLM đôi khi còn hiểu bối cảnh tốt hơn con người
  • Đây thực sự là một công cụ rất hay và hữu ích
    Nhưng trong môi trường production thì khó dùng ngay vì những lý do đã nêu ở trên
    Sẽ tốt hơn nếu có gói Debian hoặc RPM

    • Cảm ơn! Vì là bản phát hành đầu tiên nên tôi bắt đầu đơn giản, nhưng nếu nó được quan tâm, tôi sẽ chuẩn bị các gói chính thức
  • Nếu muốn build trực tiếp từ mã nguồn, có thể dùng lệnh sau

    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
    

    Cá nhân tôi thì nếu có install.sh, tôi sẽ kỳ vọng nó ưu tiên cài từ mã nguồn cục bộ
    Đây cũng là lý do những công cụ đơn giản như vậy khiến tôi muốn gắn bó với terminal

    • Cảm ơn! Nhờ @sestep mà hỗ trợ Nix đã được thêm vào, nên không còn phải lo chuyện binary nữa
    • Hoặc bạn cứ dùng Nix PR cũng được
  • Tôi tò mò “Git repository name and branch” có nghĩa là gì
    Đây có phải là tính năng phát hiện tiến trình đang chạy bên trong một kho Git hay không?

  • Ý tưởng rất hay. Trước đây alias “whodis” mà tôi tạo chỉ dùng để tìm PID đang mở cổng, còn cái này mạnh hơn nhiều

    • Cảm ơn! Mục tiêu là trở thành dao đa năng Thụy Sĩ của thông tin PID
  • Công cụ này thật sự đáng kinh ngạc. Cảm ơn đã chia sẻ
    Không biết tôi có thể tạo gói AUR cho nó được không?

    • Tất nhiên! Việc đưa lên AUR thật tuyệt. Cảm ơn bạn rất nhiều
    • Tôi không phải tác giả, nhưng sẽ rất tuyệt nếu có phiên bản AUR
      Điểm hay của Arch là những công cụ thú vị như thế này lên AUR cực nhanh