
sonar v0.4.1
localhost पोर्ट पर सुनने वाली सेवाओं के निरीक्षण और प्रबंधन के लिए CLI उपकरण
██████ ███ ██████ ██ ██████
██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ████
██ ██ ██ ██ ██ ██ ██ ██
██████ ███ ██ ██ ██ ██ ██ ██
जानें कि आपकी मशीन पर क्या चल रहा है।
Sonar localhost पर सुन रही हर चीज़ को दिखाता है और उसे क्रम में लगाता है: हर पोर्ट
एक group से संबंधित होता है — सामान्यतः वह repository जहाँ से उसे शुरू किया गया था — और
उस group के अंदर एक नामित service से। अपने dev servers को
sonar start से शुरू करें और पूरा project एक ऐसी चीज़ बन जाता है जिसे आप एक tree के रूप में list कर सकते हैं,
उसका इंतज़ार कर सकते हैं, tail कर सकते हैं, और एक ही command से बंद कर सकते हैं। Docker containers, Compose
projects और आपके द्वारा हाथ से शुरू किए गए processes भी बिना किसी
configuration के उठा लिए जाते हैं।
$ sonar list --tree
my-app (3 ports, running) ~/code/my-app
├─ 5432 db postgres:17 http://localhost:5432
├─ 5173 frontend vite (v5.4) http://localhost:5173
└─ 8000 api uvicorn app:app http://localhost:8000
ungrouped (1 port)
└─ 3000 next-server (v16.1.6) http://localhost:3000
इंस्टॉल करें
Homebrew (macOS / Linux)
brew install raskrebs/sonar/sonar
Homebrew 6 एक बार टैप पर भरोसा करने तक तीसरे पक्ष के टैप्स से फ़ॉर्मूले लोड करने से मना कर देता है
(Error: Refusing to load formula raskrebs/sonar/sonar from untrusted tap):
brew trust raskrebs/sonar
इंस्टॉल स्क्रिप्ट
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | bash
नवीनतम बाइनरी को ~/.local/bin में डाउनलोड करता है और यदि आवश्यक हो तो इसे आपके PATH में जोड़ता है। अपना टर्मिनल पुनः आरंभ करें या source ~/.zshrc चलाएँ।
Windows पर (PowerShell):
irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex
कस्टम इंस्टॉल स्थान:
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_INSTALL_DIR=/usr/local/bin bash
एक विशिष्ट संस्करण स्थापित करें:
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_VERSION=vX.Y.Z bash
$env:SONAR_VERSION="vX.Y.Z"; irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex
Go का उपयोग करना
go install github.com/raskrebs/sonar@latest
Shell पूर्णताएँ (टैब-पूर्ण पोर्ट संख्याएँ):
sonar completion zsh > "${fpath[1]}/_sonar" # zsh
sonar completion bash > /etc/bash_completion.d/sonar # bash
sonar completion fish | source # fish
साठ सेकंड
dev.sh के स्थान पर, रिपॉज़िटरी रूट में sonar.yaml में बताएं कि आपका प्रोजेक्ट कैसे चलता है:
name: my-app
services:
- name: db
cmd: docker compose up db
port: 5432
- name: api
cmd: uv run uvicorn app:app --port ${port}
port: auto
depends_on: [db]
- name: frontend
cmd: npm run dev -- --port ${port} --strictPort
port: auto
depends_on: [api]
env:
VITE_API_URL: ${api.url}
फिर इसे शुरू करें:
sonar start
✓ db http://localhost:5432 pid 41022 ~/.config/sonar/logs/my-app/db.log
✓ api http://localhost:21408 pid 41040 ~/.config/sonar/logs/my-app/api.log
✓ frontend http://localhost:21409 pid 41077 ~/.config/sonar/logs/my-app/frontend.log
3 started
following the logs; Ctrl+C stops the 3 services started here
api | INFO: Uvicorn running on http://127.0.0.1:21408
frontend | VITE v5.4 ready in 312 ms
Sonar हर port: auto सेवा के लिए एक मुफ़्त पोर्ट चुनता है और प्रत्येक सेवा को बताता है कि अन्य कहाँ हैं, ताकि दूसरा worktree पहले के बगल में बिना किसी पोर्ट टकराव के चल सके। sonar start -d बैकग्राउंड में वही करता है, और sonar down इसे रोककर पोर्ट वापस दे देता है। एक अन्य टर्मिनल में:
sonar list --tree
my-app (3 ports, running) ~/code/my-app
├─ 5432 db postgres:17 http://localhost:5432
├─ 21408 api uvicorn app:app http://localhost:21408
└─ 21409 frontend vite (v5.4) http://localhost:21409
sonar.yaml नहीं है? sonar start -- npm run dev एक कमांड को नामित सेवा के रूप में चलाता है, और sonar list तथा sonar kill किसी भी सुनने वाली चीज़ पर काम करते हैं।
नीचे # check के रूप में चिह्नित उदाहरण हर CI रन पर scripts/readme-check.sh द्वारा एक नए बिल्ड के विरुद्ध निष्पादित किए जाते हैं।
कमांड
sonar list
sonar list
sonar list --tree
sonar list --group my-app
sonar list --json
# check
sonar list --stats # CPU, memory, threads, uptime, state
sonar list --health # HTTP health checks
sonar list --filter docker # only Docker ports
sonar list --sort name # port | pid | name | type
sonar list -a # include desktop apps
sonar list -c port,process,group,cpu,mem
sonar list --host user@server # scan a remote machine over SSH
डिफ़ॉल्ट कॉलम हैं port, process, group, container, image,
containerport, url, जहाँ process वह नाम दिखाता है जो आपने पोर्ट को दिया
(sonar rename), फिर सेवा का नाम, फिर जो पता चला।
उपलब्ध कॉलम: port, process, pid, type, url, group, cpu,
mem, threads, uptime, state, connections, health, latency,
container, image, containerport, compose, project, user, bind,
ip।
डेस्कटॉप ऐप्स और सिस्टम सेवाएँ जो संयोग से सुन रही हों — Figma, Discord,
Spotify, ControlCenter, macOS .app बंडल, /System/Library/ डेमॉन — छिपी रहती हैं
जब तक आप -a पास नहीं करते।
sonar start
किसी प्रोजेक्ट को उसके sonar.yaml से शुरू करें:
sonar start # every service in the nearest sonar.yaml
sonar start api frontend # only these (they still wait for their dependencies)
sonar start ../other-project # the sonar.yaml in or above another directory
sonar start -d # in the background, like `sonar up`
फोरग्राउंड में, sonar डेमन के माध्यम से सेवाएँ शुरू करता है, हर पंक्ति के सामने सेवा नाम के साथ उनके लॉग का अनुसरण करता है, और जब आप Ctrl+C दबाते हैं तो यह शुरू की गई सेवाओं को रोक देता है। जो सेवा पहले से चल रही थी उसे अछूता छोड़ दिया जाता है, और sonar स्वयं तब लौट आता है जब उसके द्वारा शुरू की गई प्रत्येक सेवा समाप्त हो जाती है।
-- से पहले के आर्ग्युमेंट किसी डायरेक्टरी या सेवाओं का नाम देते हैं; -- के बाद का सब कुछ एक कमांड होता है। या किसी समूह में नामित सेवा के रूप में एक कमांड चलाएँ:
sonar start -- npm run dev
sonar start --group my-app --name frontend -- npm run dev
sonar start --port 5173 -- npm run dev # expected port, before it binds
sonar start --detach --name api -- uv run uvicorn app:app
sonar start --list
कुछ भी पास करने की आवश्यकता नहीं है:
- Group —
--group, अन्यथा निकटतमsonar.yamlमेंname, अन्यथा git root की directory का नाम (एक worktreerepo@worktreeबन जाता है), अन्यथा वर्तमान directory का नाम। - Name —
--name, अन्यथा वहsonar.yamlservice जिसकाcmdमेल खाता है, अन्यथा command से अनुमानित (npm run dev→dev,uv run api→api,python -m uvicorn→uvicorn,./dev.sh→dev.sh)। - Port —
--portएक संकेत है, binding नहीं: run तब तकstartingदिखाता है जब तक port वास्तव में listening न हो जाए, और daemon इसका उपयोग process को port से मिलाने के लिए करता है।
child stdin, stdout, stderr, cwd और environment विरासत में लेता है, साथ ही
SONAR_GROUP, SONAR_NAME और SONAR_RUN_ID भी। इसे अपना process group मिलता है,
इसलिए sonar kill पूरे tree को समाप्त कर देता है — एक dev server अपने watchers और
workers सहित। Ctrl+C आगे भेजा जाता है, और sonar child के exit code के साथ बाहर निकलता है।