- 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
- Điều gì đang chạy
- Nó được khởi động như thế nào
- Điều gì đang duy trì nó
- 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
Ý 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
Chỉ cần nhìn khung hình cuối là đã truyền tải đủ thông tin cần thiết
Tôi đã thay bằng ảnh tĩnh, và rất cảm ơn tất cả các đề xuấ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
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
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
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
Đầ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
curlSau 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
curlkhông phù hợp với tất cả mọi ngườiVì 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
wdtci: “what does this curl install?”systemctl status $pidcũng có thể cung cấp khá nhiều thông tinCâ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
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
Các quyết định thực tế đều do con người đưa ra
Nếu phát triển theo hướng chú trọng kết quả thì tôi thấy ổn
Đâ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
Nếu muốn build trực tiếp từ mã nguồn, có thể dùng lệnh sau
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
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?
Liên kết tới đoạn mã liên quan
Ý 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ô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?
Điểm hay của Arch là những công cụ thú vị như thế này lên AUR cực nhanh