
أداة سطر أوامر لفحص وإدارة الخدمات التي تستمع على منافذ localhost
███████╗ ██████╗ ███╗ ██╗ █████╗ ██████╗
██╔════╝██╔═══██╗████╗ ██║██╔══██╗██╔══██╗
███████╗██║ ██║██╔██╗ ██║███████║██████╔╝
╚════██║██║ ██║██║╚██╗██║██╔══██║██╔══██╗
███████║╚██████╔╝██║ ╚████║██║ ██║██║ ██║
╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝
اعرف ما الذي يعمل على جهازك.
لقد سئمت من تشغيل lsof -iTCP -sTCP:LISTEN | grep ... كل مرة يكون فيها منفذ مشغولاً بالفعل، ثم قضاء دقيقة أخرى لمعرفة ما إذا كانت حاوية Docker أو خادم تطوير مهجور من مساحة عمل أخرى. لذا قمت ببناء sonar.
يعرض كل شيء يستمع على localhost، مع أسماء حاويات Docker، ومشاريع Compose، واستخدام الموارد، وعناوين URL قابلة للنقر. يمكنك قتل العمليات، وعرض السجلات، والدخول إلى الحاويات، وأكثر — كل ذلك برقم المنفذ.
$ sonar list
PORT PROCESS CONTAINER IMAGE CPORT URL
1780 proxy (traefik:3.0) my-app-proxy-1 traefik:3.0 80 http://localhost:1780
3000 next-server (v16.1.6) http://localhost:3000
5432 db (postgres:17) my-app-db-1 postgres:17 5432 http://localhost:5432
6873 frontend (frontend:latest) my-app-frontend-1 frontend:latest 5173 http://localhost:6873
9700 backend (backend:latest) my-app-backend-1 backend:latest 8000 http://localhost:9700
5 ports (4 docker, 1 user)
brew install raskrebs/sonar/sonar
على macOS يقوم هذا أيضًا بتثبيت تطبيق شريط القوائم sonar-tray.
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 install github.com/raskrebs/sonar@latest
ملاحظة:
go installيقوم بتثبيت واجهة سطر الأوامر فقط. تطبيق شريط القوائم (sonar tray) هو ملف ثنائي أصلي بلغة Swift ويجب بناؤه بشكل منفصل — انظر تطبيق شريط القوائم أدناه.
إكمالات shell (إكمال أرقام المنافذ بالضغط على Tab):
sonar completion zsh > "${fpath[1]}/_sonar" # zsh
sonar completion bash > /etc/bash_completion.d/sonar # bash
sonar completion fish | source # fish
sonar list # عرض جميع المنافذ
sonar list --stats # تضمين وحدة المعالجة المركزية، الذاكرة، الحالة، وقت التشغيل
sonar list --filter docker # منافذ Docker فقط
sonar list --sort name # الترتيب حسب اسم العملية
sonar list --json # إخراج JSON
sonar list -a # تضمين تطبيقات سطح المكتب
sonar list -c port,cpu,mem,uptime,state # أعمدة مخصصة
sonar list --health # تشغيل فحوصات HTTP الصحية
sonar list --host user@server # فحص جهاز عن بعد عبر SSH
بشكل افتراضي، يخفي sonar تطبيقات سطح المكتب وخدمات النظام التي تستمع على منافذ TCP ولكنها غير ذات صلة بالتطوير — مثل Figma، Discord، Spotify، ControlCenter، AirPlay، وحزم .app أخرى على macOS وعمليات /System/Library/. استخدم -a لتضمينها.
الأعمدة المتاحة: port, process, pid, type, url, cpu, mem, threads, uptime, state, connections, health, latency, container, image, containerport, , , , ,
sonar info 3000
يعرض كل شيء عن المنفذ: الأمر الكامل، المستخدم، عنوان الربط، وحدة المعالجة المركزية/الذاكرة/الخيوط، وقت التشغيل، نتيجة الفحص الصحي، وتفاصيل Docker إذا كانت مطبقة.
sonar kill 3000 # SIGTERM
sonar kill 3000 -f # SIGKILL
sonar kill-all --filter docker # إيقاف جميع حاويات Docker
sonar kill-all --project my-app # إيقاف مشروع Compose
sonar kill-all --filter user -y # تخطي التأكيد
يتم إيقاف حاويات Docker باستخدام docker stop بدلاً من إرسال الإشارات.
sonar logs 3000
بالنسبة لحاويات Docker، يقوم بتشغيل docker logs -f. للعمليات المحلية، يكتشف ملفات السجل عبر lsof ويقوم بتتبعها. كحل احتياطي، يستخدم log stream على macOS أو /proc/<pid>/fd على Linux.
sonar attach 3000 # دخول shell إلى حاوية Docker، أو اتصال TCP
sonar attach 3000 --shell bash # shell معين
sonar watch # استقصاء كل ثانيتين، عرض الفروقات
sonar watch --stats # إحصائيات الموارد الحية (مثل docker stats)
sonar watch -i 500ms # استقصاء أسرع
sonar watch --notify # إشعارات سطح المكتب عند صعود/نزول المنافذ
sonar watch --host user@server # مراقبة جهاز عن بعد
sonar graph # عرض الخدمات التي تتحدث مع بعضها
sonar graph --json # إخراج منظم
sonar graph --dot # تنسيق Graphviz DOT
يعرض الاتصالات القائمة بين المنافذ المستمعة (مثل اتصال الخلفية بـ postgres).
احفظ مجموعة من المنافذ المتوقعة لمشروع، ثم تحقق مما إذا كانت جميعها قيد التشغيل أو قم بإيقافها:
sonar profile create my-app # التقاط سريع للمنافذ الحالية
sonar profile list # عرض الملفات الشخصية المحفوظة
sonar profile show my-app # عرض تفاصيل الملف الشخصي
sonar up my-app # التحقق من المنافذ المتوقعة العاملة
sonar down my-app # إيقاف جميع المنافذ في الملف الشخصي
sonar wait 5432 # الانتظار حتى يقبل المنفذ الاتصالات
sonar wait 5432 3000 6379 # انتظار منافذ متعددة
sonar wait 5432 --timeout 30s # الفشل بعد 30 ثانية
sonar wait 5432 --http # انتظار استجابة HTTP 200، وليس مجرد فتح TCP
sonar wait 5432 --http=/health # التحقق من نقطة نهاية محددة
sonar wait 5432 -i 500ms # فترة استقصاء مخصصة
sonar wait 5432 -q # بدون إخراج، فقط رمز الخروج (للسكريبتات)
مفيد للسكريبتات حول docker compose up -d أو الخدمات الخلفية. العلامة --http تنتظر استجابة HTTP فعلية 200-399، وليس مجرد مأخذ TCP، مما يلتقط الخدمات التي تقبل الاتصالات قبل أن تكون جاهزة حقًا. استخدم --http=/health للتحقق من نقطة نهاية محددة. رموز الخروج: 0 (جاهز)، 1 (مهلة)، 2 (تمت المقاطعة).
docker compose up -d
sonar wait 5432 3000 --timeout 60s && npm run migrate && npm run test
sonar map 6873 3002
يقوم بتوكيل حركة المرور بحيث تكون الخدمة على المنفذ 6873 متاحة أيضًا على المنفذ 3002.
sonar next # أول منفذ حر بعد 3000
sonar next 8000 # أول منفذ حر بعد 8000
sonar next 3000-3100 # أول منفذ حر في النطاق
sonar next -n 3 # 3 منافذ حرة متتالية
sonar next --json # إخراج JSON
sonar open 3000 # فتح في المتصفح
sonar tray # تطبيق شريط القوائم مع إحصائيات حية (macOS)
sonar --no-color # تعطيل الألوان (يحترم أيضًا متغير البيئة NO_COLOR)
العلامة --stats تجلب استخدام الموارد لكل عملية وكل حاوية. بالنسبة لحاويات Docker، تستخدم واجهة برمجة تطبيقات Docker Engine للحصول على مقاييس دقيقة لكل حاوية. بدون --stats، يعود sonar فورًا.
sonar يقرأ الإعدادات الافتراضية الاختيارية من ~/.config/sonar/config.yaml. الملف اختياري — بدونه، يتم تطبيق الإعدادات الافتراضية المدمجة. دائمًا ما تلغي خيارات سطر الأوامر ملف الإعدادات.
أنشئ ملف بداية:
sonar config init # كتابة قالب مع التعليقات
sonar config path # طباعة موقع الملف
sonar config edit # فتحه في $EDITOR
مثال على الإعدادات:
list:
columns: [port, process, container, image, containerport, url]
sort: port # port | pid | name | type
filter: "" # docker | user | system | "" (all)
all: false # تضمين تطبيقات سطح المكتب افتراضيًا
color: true # تعيين false لتعطيل الإخراج الملون
services: # تسمية المنافذ المخصصة/غير المعروفة
9000: php-fpm
5050: my-dashboard
يتم تجاهل القيم غير الصالحة مع تحذير؛ يستمر sonar بالإعدادات الافتراضية.
تطبيق شريط القوائم (macOS فقط) هو ملف ثنائي أصلي بلغة Swift يعرض إحصائيات المنافذ الحية في شريط القوائم الخاص بك. إذا قمت بتثبيت sonar عبر سكريبت التثبيت أو إصدار GitHub، يتم تضمين الملف الثنائي لشريط القوائم (sonar-tray) تلقائيًا.
إذا قمت بالتثبيت عبر go install، فقم ببنائه يدويًا:
swiftc -O -o sonar-tray tray/SonarTray.swift -target arm64-apple-macos13
ثم انقل sonar-tray إلى مكان ما في $PATH وشغّل:
sonar tray
lsof)ss)netstat)شكرًا لكل من ساهم في sonar!
composeprojectuserbindip