
eBPF पर निर्मित एक आधुनिक सिस्कॉल ट्रेसर। strace की तरह सोचें, लेकिन वास्तविक TUI, स्मार्ट फिल्टर, TLS डिक्रिप्शन, और वास्तव में पढ़ने योग्य आउटपुट के साथ।
Linux के लिए एक syscall ट्रेसर, eBPF पर निर्मित। strace जैसा, लेकिन एक लाइव TUI, स्मार्ट फ़िल्टर और आर्गुमेंट डिकोडिंग के साथ जिसे आप वास्तव में पढ़ सकते हैं।

$ sudo snoop curl https://example.com
[ 0.001] curl(1234/1234) openat(AT_FDCWD, "/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 4 <0.031ms>
[ 0.002] curl(1234/1234) read(4, 0x7f3a1c000b20, 4096) = 4096 <0.012ms>
[ 0.003] curl(1234/1234) socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 5 <0.008ms>
[ 0.004] curl(1234/1234) connect(5, 93.184.216.34:443) = 0 <42.187ms>
[ 0.046] curl(1234/1234) sendto(5, 0x55a3bc001b40, 78, MSG_NOSIGNAL) = 78 <0.011ms>
या इसे --raw के बिना चलाएँ और एक पूर्ण-स्क्रीन TUI प्राप्त करें:
snoop pid:1234 comm:curl events:142 elapsed:0.341s
┌── syscall stream ─────────────────────────────────────┐┌── top syscalls ─────────┐
│ [ 0.001] curl openat("/etc/ssl/…") = 4 <0.031ms> ││ syscall count pct│
│ [ 0.002] curl read(4, …) = 4096 ││ read 38 26.8%│
│ [ 0.003] curl socket(AF_INET, …) = 5 ││ write 21 14.8%│
│ [ 0.004] curl connect(5, 93.184.216.34:443) = 0 ││ openat 18 12.7%│
│ [ 0.046] curl sendto(5, …) = 78 ││ mmap 14 9.9%│
└───────────────────────────────────────────────────────┘└─────────────────────────┘
[q]uit [Space]pause [/]search [f]iles [n]et [c]lear [↑↓]scroll [G]bottom
strace ptrace का उपयोग करता है, जो हर syscall पर आपकी प्रक्रिया को रोकता है। snoop इसके बजाय eBPF tracepoints का उपयोग करता है -- आपकी प्रक्रिया पूरी गति से चलती रहती है और ट्रेसिंग कर्नेल में होती है। प्रदर्शन के अलावा, snoop तर्कों को कुछ ऐसे डिकोड करता है जिसे आप वास्तव में पढ़ सकते हैं, इसमें एक रीयल-टाइम TUI है, और यह ट्रेस को सेव/रीप्ल/डिफ़ कर सकता है।
--raw (strace-संगत), --json (jq के लिए JSON Lines), --explain (syscalls को उच्च-स्तरीय गतिविधि सारांशों में समूहित करता है)--files, --net, --slow 10, --syscall openat-p PID) या नई प्रक्रिया स्पॉन (snoop <cmd>)--follow फोर्क किए गए चाइल्ड को भी ट्रेस करता है--docker <name> और --pod <name> कंटेनर के अंदर सब कुछ ट्रेस करता है--tls uprobes के माध्यम से SSL_write/SSL_read को हुक करके प्लेनटेक्स्ट दिखाता है--ltrace malloc/free/calloc/realloc को ट्रैक करता हैsnoop record डिस्क पर सेव करता है, snoop view ऑफ़लाइन रीप्ले करता है (रूट की आवश्यकता नहीं)snoop diff before.snoop after.snoop दो रनों के बीच में क्या बदला दिखाता है--flamegraph out.svgकोई कर्नेल मॉड्यूल या C टूलचेन नहीं। eBPF प्रोग्राम शुद्ध Rust (aya) में हैं और बाइनरी में एम्बेडेड होते हैं।
CAP_BPF + CAP_PERFMONcurl -L https://github.com/pandaadir05/snoop/releases/latest/download/snoop-x86_64-linux.tar.gz \
| tar -xz
sudo install -m755 snoop /usr/local/bin/snoop
aarch64 के लिए, x86_64 को aarch64 से बदलें।
cargo install --git https://github.com/pandaadir05/snoop snoop
यह eBPF प्रोग्राम को स्वचालित रूप से बनाता है। कोई C टूलचेन या कर्नेल हेडर की आवश्यकता नहीं, सिर्फ Rust।
# किसी कमांड को ट्रेस करें
sudo snoop ls /etc
sudo snoop -- nginx -g 'daemon off;'
# चल रही प्रक्रिया से अटैच करें
sudo snoop -p $(pidof postgres)
sudo snoop -p 1234 --follow # फोर्क किए गए चाइल्ड को भी ट्रेस करें
# कंटेनर
sudo snoop --docker my-nginx
sudo snoop --pod my-app-pod --namespace production
# फ़िल्टरिंग
sudo snoop -p 1234 --files # केवल फाइल-सिस्टम कॉल
sudo snoop -p 1234 --net # केवल नेटवर्क कॉल
sudo snoop -p 1234 --slow 5 # केवल 5ms से धीमी कॉल
sudo snoop -p 1234 --syscall openat --syscall read
--explain कच्चे syscalls को उच्च-स्तरीय सारांशों में समूहित करता है, बजाय हर कॉल को अलग-अलग दिखाने के:
sudo snoop -p 1234 --explain
READ /etc/passwd ↓1.2 KB (2 calls, 0.80ms)
NET 127.0.0.1:5432 ↑512 B ↓4.0 KB (18.20ms)
EXEC /usr/bin/python3
OpenSSL में SSL_write/SSL_read को हुक करके प्लेनटेक्स्ट कैप्चर करता है:
sudo snoop -p 1234 --tls
sudo snoop -p 1234 --ltrace
एक ट्रेस रिकॉर्ड करें, फिर बाद में रूट के बिना रीप्ले करें:
sudo snoop record -p 1234 -o trace.snoop
snoop view trace.snoop
snoop view trace.snoop --files --slow 5 --json | jq 'select(.name=="read")'
डिप्लॉय के बाद रिग्रेशन पकड़ने के लिए उपयोगी:
sudo snoop record -p 1234 -o before.snoop
# ... बदलाव डिप्लॉय करें ...
sudo snoop record -p 1234 -o after.snoop
snoop diff before.snoop after.snoop
SYSCALL COUNTS
read 1200 → 1800 (+50.0%) ▲
openat 340 → 210 (-38.2%) ▼
DURATION REGRESSIONS (median)
read 0.02ms → 0.08ms (+300%)
ONLY IN after
statx (4x)
sudo snoop -p 1234 --json | jq 'select(.name == "connect")'
sudo snoop -p 1234 --flamegraph syscalls.svg
-p, --pid <PID> चल रही प्रक्रिया से अटैच करें
--follow फोर्क किए गए चाइल्ड को ट्रेस करें (--pid के साथ आवश्यक)
--docker <NAME|ID> Docker कंटेनर में सभी प्रक्रियाओं को ट्रेस करें
--pod <POD> Kubernetes पॉड में सभी प्रक्रियाओं को ट्रेस करें
-n, --namespace <NS> Kubernetes नेमस्पेस (डिफ़ॉल्ट: default)
--raw एक-पंक्ति strace-संगत आउटपुट
--json JSON Lines — प्रति syscall एक ऑब्जेक्ट
--explain सिमैंटिक गतिविधि सारांश
--files केवल फाइल-सिस्टम syscalls
--net केवल नेटवर्क syscalls
--slow <MILLIS> केवल थ्रेशोल्ड से धीमी कॉल
--syscall <NAME> केवल यह syscall (दोहराने योग्य)
--no-decode कच्चे हेक्स तर्क, कोई डिकोडिंग नहीं
--tls SSL_write/SSL_read uprobes के माध्यम से TLS प्लेनटेक्स्ट कैप्चर करें
--ltrace malloc/free/calloc/realloc ट्रेस करें
--flamegraph <PATH> बाहर निकलने पर flamegraph SVG लिखें
--ebpf-obj <PATH> एम्बेडेड eBPF ऑब्जेक्ट को ओवरराइड करें [$SNOOP_EBPF_OBJ]
| कुंजी | क्रिया |
|---|---|
q | बाहर निकलें |
Space | रोकें / जारी रखें |
/ | इंक्रीमेंटल खोज |
f | फाइल-सिस्टम फ़िल्टर टॉगल करें |
n | नेटवर्क फ़िल्टर टॉगल करें |
c | घटना सूची साफ़ करें |
Enter | चयनित घटना के लिए विवरण पॉपअप दिखाएँ |
↑ / k | ऊपर स्क्रॉल करें |
↓ / j | नीचे स्क्रॉल करें |
G / End | नवीनतम घटना पर जाएँ |
g / Home | सबसे पुरानी घटना पर जाएँ |
दो eBPF प्रोग्राम raw_syscalls/sys_enter और sys_exit से अटैच होते हैं। प्रवेश पर, syscall नंबर और तर्क एक प्रति-थ्रेड स्क्रैच मैप में जाते हैं। निकास पर, वापसी मान प्रवेश डेटा के साथ जोड़ा जाता है और एक रिंग बफर में धकेल दिया जाता है। यूजरस्पेस एक एसिंक fd पर रिंग बफर को ड्रेन करता है और सब कुछ फ़िल्टर/डिकोड पाइपलाइन के माध्यम से चलाता है।
kernel userspace
────── ─────────
raw_syscalls/sys_enter ──► SYSCALL_ENTER map (per-tid scratch)
raw_syscalls/sys_exit ──► EVENTS ring buffer (4 MiB)
│
poll consumer (tokio::spawn)
│
┌──────────┴──────────┐
RawOutput TuiApp
(one line/syscall) (ratatui TUI)
eBPF प्रोग्राम aya के साथ Rust में लिखे गए हैं, बिल्ड समय पर BPF बाइटकोड में संकलित किए जाते हैं, और बाइनरी में एम्बेडेड होते हैं। कोई रनटाइम निर्भरता या कर्नेल हेडर नहीं।
git clone https://github.com/pandaadir05/snoop
cd snoop
# BPF टार्गेट के लिए केवल Nightly की आवश्यकता है
rustup toolchain install nightly
rustup component add rust-src --toolchain nightly
# bpf-linker eBPF ऑब्जेक्ट को लिंक करता है (कोई सिस्टम LLVM की आवश्यकता नहीं)
cargo install bpf-linker --no-default-features
cargo build --release
sudo ./target/release/snoop -p $$
बिल्ड स्क्रिप्ट eBPF प्रोग्राम को स्वचालित रूप से संकलित करती है। कोई अलग चरण आवश्यक नहीं।
डेवलपमेंट के दौरान आप xtask का भी उपयोग कर सकते हैं:
cargo xtask run -- -p $$
| परत | क्रेट |
|---|---|
| eBPF प्रोग्राम | aya-ebpf |
| eBPF लोडर | aya |
| TUI | ratatui + crossterm |
| CLI | clap (डिराइव) |
| एसिंक रनटाइम | tokio |
| फ्लेमग्राफ | inferno |
MIT या Apache-2.0, आपकी पसंद पर।