अपडेट पर वापस जाएँ
New releaseSep 4, 2026

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 का नाम (एक worktree repo@worktree बन जाता है), अन्यथा वर्तमान directory का नाम।
  • Name — --name, अन्यथा वह sonar.yaml service जिसका 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 के साथ बाहर निकलता है।

श्रेणियाँ