
ltm Linux के लिए एक मशीन-इतिहास डिबगर है। यह eBPF के माध्यम से प्रक्रिया, फ़ाइल, नेटवर्क, मेमोरी और ब्लॉक-I/O मेटाडेटा रिकॉर्ड करता है, फिर आपको टाइमलाइन क्वेरी करने देता है।
Linux के लिए Machine-history डीबगर। यह eBPF के माध्यम से प्रक्रिया, फ़ाइल, नेटवर्क, मेमोरी और ब्लॉक I/O को रिकॉर्ड करता है, मेटाडेटा को SQLite में संग्रहीत करता है, और बॉक्स पर क्या हुआ इसके बारे में टाइमलाइन / डिफ़ / सादे अंग्रेज़ी / SQL प्रश्नों के उत्तर देता है।
⚠️ आज केवल Tracepoint-आधारित कैप्चर — रिकॉर्डिंग वर्तमान में ट्रेसपॉइंट प्रोग्राम का उपयोग करती है। यह अभी तक kprobes, uprobes, XDP या TC हुक का उपयोग नहीं करता है, इसलिए यह गहरे कर्नेल आंतरिक, यूज़र-स्पेस फ़ंक्शन ट्रेसिंग या पैकेट-पथ निरीक्षण की तुलना में स्थिर syscall/ब्लॉक/प्रक्रिया मेटाडेटा को प्राथमिकता देता है।
go build -o bin/ltm ./cmd/ltm
sudo ./bin/ltm start # रिकॉर्ड (eBPF; root, Linux/x86_64)
./bin/ltm timeline --since 5m
./bin/ltm watch # लाइव टेल; Ctrl-C से रोकें
./bin/ltm diff --from 10m --to now
./bin/ltm query "who modified /etc/some.conf?"
sudo ./bin/ltm stop
रिकॉर्डिंग के लिए रूट (या CAP_BPF + CAP_PERFMON) की आवश्यकता है। क्वेरी करने के लिए नहीं।
लाइव Linux रिकॉर्डर के बिना: ltm benchmark --count 1000 एक DB में सिंथेटिक इवेंट सीड करता है जिसे आप timeline, diff और query से देख सकते हैं।
ग्लोबल फ़्लैग सबकमांड से पहले आते हैं (ltm --db /tmp/ltm.db status)।
डिफ़ॉल्ट: DB ~/.local/share/ltm/ltm.db, PID ~/.local/run/ltm.pid।
मशीन-पठनीय आउटपुट के लिए किसी भी रीड कमांड में --json जोड़ें।
एक SQLite डेटाबेस, WAL लेखक डेमॉन द्वारा धारित। प्रत्येक रीड पथ केवल-पढ़ने के लिए खोलता है (PRAGMA query_only=ON) — क्वेरीज़ कभी भी लेखक से प्रतिस्पर्धा नहीं करतीं या लॉग को उत्परिवर्तित नहीं करतीं। केवल मेटाडेटा; कोई फ़ाइल सामग्री नहीं।
export LTM_AGENT=claude # या codex, cursor, gemini, auto, या कस्टम कमांड
ltm query "which process wrote to files the most today?"
एजेंट SQL मुद्रित किया जाता है, फिर केवल-पढ़ने वाले कनेक्शन पर चलाया जाता है, और तब तक अस्वीकार कर दिया जाता है जब तक यह एक एकल SELECT न हो। कोई एजेंट नहीं (या एजेंट विफलता) → अंतर्निर्मित टेम्पलेट।
~60 ट्रेसपॉइंट्स: प्रक्रिया (exec, exit, fork, clone, kill), फ़ाइल (open/close, read/write, rename, unlink, link, symlink, mkdir, rmdir, chmod, chown, stat, access, truncate, dup, pipe, …), मेमोरी (mmap, munmap, mprotect), नेटवर्क (socket, connect, bind, listen, accept, send/recv, shutdown), ब्लॉक (block_rq_issue)।
BPF /proc, /sys, /dev और डेमॉन के स्वयं के PID को छोड़ता है। हस्तलिखित ट्रेसपॉइंट मेनिफ़ेस्ट internal/abi/abi.yaml में है; चेक-इन रनटाइम तालिका internal/abi/tracepoints_gen.go में उत्पन्न होती है। collector.bpf.c संपादित करने के बाद, make ebpf से पुनर्निर्माण करें। internal/abi/abi.yaml में ABI मेटाडेटा संपादित करने के बाद, make generate चलाएँ और फिर make ebpf यदि कर्नेल-इवेंट लेआउट या ट्रेसपॉइंट तालिका बदली हो।
-D__TARGET_ARCH_x86 के साथ बनाया गया है (#2)। क्वेरी करना और बेंचमार्क-जनित डेमो डेटा के लिए Linux रिकॉर्डिंग समर्थन की आवश्यकता नहीं है।readv/writev/sendmsg/recvmsg 0 रिपोर्ट करता है।go test ./... # स्थानीय/यूनिट परीक्षण
make generate # abi.yaml से ABI/स्कीमा आउटपुट पुनर्जीवित करें
make ebpf # चेक-इन BPF ऑब्जेक्ट/बाइंडिंग पुनर्जीवित करें (Linux)
make integration # वास्तविक eBPF रिकॉर्डिंग; Linux + root
लेआउट: cmd/ltm प्रवेश बिंदु; बाकी सब internal/ के अंतर्गत (abi, cli, daemon, collector, ebpf, storage, agent, diff, query)।
ABI/स्कीमा जनरेटर इवेंट परिभाषाओं, स्टोरेज DDL, ट्रेसपॉइंट मेटाडेटा और कर्नेल-मुखी स्ट्रक्ट को एक सत्य स्रोत से बांधता है: internal/abi/abi.yaml। यह जानबूझकर CPython के Argument Clinic वर्कफ़्लो (स्रोत) के समान है: जब नया कैप्चर किया गया इवेंट/मॉड्यूल सतह जोड़ते हैं, तो मेनिफ़ेस्ट को अपडेट करें और चेक-इन आउटपुट को पुनर्जीवित करें, बजाय व्युत्पन्न Go या C फ़ाइलों को हाथ से संपादित करने के।
दस्तावेज़: docs/ (ABI, CLI, जनित फ़ाइलें, क्वेरी करना, रिकॉर्डिंग, आर्किटेक्चर, सुरक्षा)।
योगदानकर्ता नियम: AGENTS.md।
| Command | कार्य |
|---|
start / stop / status | रिकॉर्डर को नियंत्रित करें |
timeline | --pid --uid --comm --category --action --path --exe --since --until --limit द्वारा फ़िल्टर करें (दोहराने योग्य; --path/--exe SQL LIKE हैं) |
watch | लाइव टेल (--interval --since --category --comm --pid) |
diff --from --to | दो समयों के बीच मशीन-स्थिति में बदलाव |
query "<प्रश्न>" | सादा अंग्रेज़ी (टेम्पलेट, या एक एजेंट → SQL) |
query sql ["<SELECT>"] | केवल-पढ़ने वाला SQL; बिना आर्ग के स्कीमा प्रिंट करता है (ltm sql भी काम करता है) |
prune --older-than 720h [--vacuum] | पुरानी पंक्तियाँ हटाएँ, वैकल्पिक रूप से डिस्क स्थान पुनः प्राप्त करें |
benchmark --count N | N सिंथेटिक इवेंट लिखें (कोई eBPF नहीं) |
version | बिल्ड संस्करण, कमिट, प्लेटफ़ॉर्म |