كيف تقتل عملية Linux عن طريق رقم المنفذ

نشرت: 2022-10-08
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

لقتل عملية Linux تحتاج إلى معرفها أو اسمها. إذا كان كل ما تعرفه هو المنفذ الذي يستخدمه ، فهل لا يزال بإمكانك قتله؟ نعم ، بعدة طرق مختلفة.

عمليات القتل

من حين لآخر ، يمكن أن تصبح عملية Linux غير مستجيبة. قد يتوقف عن العمل بشكل صحيح ، أو قد يستمر في العمل ولكن تجاهل الطلبات لإغلاقه ، أو بدء التهام الذاكرة أو وحدة المعالجة المركزية أو النطاق الترددي للشبكة.

كيف تقتل العمليات من Linux Terminal
ذات صلة كيف تقتل العمليات من Linux Terminal

مهما كانت دوافعك ، هناك طرق لقتل عملية من سطر أوامر Linux. الطريقة التقليدية هي استخدام أمر kill مع معرف العملية للعملية التي تريد إنهاؤها. قيادة kill لها بعض الأقارب المقربين. سيقتل الأمر pkill العملية بالاسم ، killall جميع العمليات التي يمكنه العثور عليها في جزء من الاسم.

إذا كان كل ما تعرفه عن عملية ما هو أنها تستخدم منفذًا على جهاز الكمبيوتر الخاص بك ، فلا تزال هناك طرق للتعرف عليها وقتلها. في مصطلحات الشبكات ، يمكن أن يعني مصطلح "المنفذ" اتصالًا فعليًا تقوم بإدخال كبل به قابس في النهاية ، مثل موصل شبكة CAT5 أو 6 ، أو قد يعني منفذ برنامج.

منفذ البرنامج هو الجزء الأخير من اتصال الشبكة. يحدد عنوان IP الخاص بالجهاز الكمبيوتر أو أي جهاز شبكة آخر. التطبيقات داخل الكمبيوتر تستخدم منافذ مختلفة. توفر هذه مستوى آخر من التفاصيل. وصلت حركة مرور الشبكة إلى الكمبيوتر الصحيح باستخدام عنوان IP ، وباستخدام عنونة المنفذ يمكن تسليمها إلى التطبيق الصحيح.

إنه مثل وصول بريد بريدي إلى فندق ، ثم يتم فرزه وتسليمه إلى الغرف المناسبة. عنوان IP هو مثل عنوان شارع الفندق ، وأرقام الغرف تشبه أرقام المنافذ.

إذا رأيت نشاطًا للشبكة على أحد المنافذ ولم تتعرف على العملية التي تولده ، أو كان سلوكه يمثل مشكلة أو مريبًا ، فقد ترغب في إنهاء العملية. حتى لو كان كل ما تعرفه هو رقم المنفذ ، يمكنك تعقب العملية وقتلها.

خلق اتصالات مع socat

حتى يكون لدينا بعض الاتصالات لقتلها ، سنستخدم socat لإنشاء اتصالات شبكة باستخدام بروتوكولات مختلفة. ستحتاج إلى تثبيت socat . لتثبيته على Ubuntu ، استخدم هذا الأمر:

 sudo apt install socat 

تثبيت socat على أوبونتو

على Fedora استخدم dnf :

 sudo dnf تثبيت socat 

تركيب سكات على فيدورا

في Manjaro ، تحتاج إلى كتابة:

 sudo pacman -S socat 

تثبيت سكات على مانجارو

بناء جملة socat واضح ومباشر إذا كان طويلا بعض الشيء. نحتاج إلى توفير عناوين المصدر والوجهة. لكل من هؤلاء ، نحتاج إلى توفير البروتوكول وعنوان IP ورقم المنفذ. يمكننا استبدال STDIN أو STDOUT كمصدر أو وجهة.

يقوم هذا الأمر بإنشاء اتصال بين مأخذ استماع TCP على المنفذ 7889 ، على عنوان IP للاسترجاع 127.0.0.1 ، و STDOUT. تقوم علامة العطف " & " بتشغيل الأمر في الخلفية ، بحيث نحتفظ بالوصول إلى سطر الأوامر.

 socat tcp-listen: 7889، bind = 127.0.0.1 stdout & 

إنشاء اتصال TCP مقبس استماع مع socat

سننشئ اتصالين إضافيين حتى يكون لدينا مجموعة صغيرة من المقابس باستخدام بروتوكولات مختلفة. سننشئ اتصال UDP واتصال SCTP. الجزء الوحيد من الأمر الذي يتغير هو البروتوكول.

 socat udp-listen: 7889 ، bind = 127.0.0.1 stdout &
 socat sctp-listen: 9999 ، bind = 127.0.0.1 stdout & 

إنشاء اتصالات الاستماع UDP و SCTP مع socat

ذات صلة: ما هو الفرق بين TCP و UDP؟

باستخدام Kill

بالطبع ، يمكننا استخدام kill لإنهاء العملية ، طالما أننا نعرف هوية العملية. للعثور على PID ، يمكننا استخدام الأمر lsof .

لسرد تفاصيل العملية على المنفذ 7889 الذي يستخدم بروتوكول TCP ، نستخدم الخيار -i (عنوان الإنترنت) ، مثل هذا.

 lsof -i tcp: 7889 

استخدام lsof لإظهار تفاصيل عملية باستخدام منفذ وبروتوكول محدد

معرف المنتج لهذه العملية هو 3141 ، ويمكننا المضي قدمًا واستخدام ذلك مع kill :

 3141

يمكننا توفير بعض الجهد على أنفسنا إذا استخدمنا الأنابيب. إذا قمنا بتوجيه إخراج lsof إلى awk وأخبرنا awk بالبحث عن الأسطر التي تحتوي على المنفذ الذي نهتم به - 7889 - وطبعنا الحقل الثاني من هذا السطر ، فسنقوم بعزل PID.

 lsof -i tcp: 7889 | awk '/ 7889 / {print $ 2}' 

تحويل إخراج lsof إلى awk

يمكننا بعد ذلك توجيه الإخراج من awk إلى أمر kill باستخدام xargs . يأخذ الأمر xargs مدخلاته الموصلة بالأنابيب ويمررها إلى أمر آخر كمعلمات سطر أوامر. سنستخدم xargs مع أمر kill .

 lsof -i tcp: 7889 | awk '/ 7889 / {print $ 2}' | xargs قتل 

استخدام الأنابيب لأخذ إخراج lsof إلى awk ومن awk إلى xargs والقتل

لا نحصل على أي ملاحظات مرئية. بطريقة Linux النموذجية ، لا توجد أخبار جيدة. إذا كنت تريد التحقق من إنهاء العملية ، يمكنك استخدام lsof مرة أخرى.

 lsof -i tcp: 7889 

استخدام lsof للبحث عن تفاصيل عملية باستخدام منفذ وبروتوكول معين دون نجاح

نظرًا لأن lsof لا يبلغ عن أي شيء ، فإننا نعلم أنه لا يوجد اتصال من هذا القبيل.

يمكننا إزالة عملية باستخدام بروتوكول UDP ببساطة عن طريق استبدال "tcp" بـ "udp" في الأمر السابق.

 lsof -i udp: 7889 | awk '/ 7889 / {print $ 2}' | xargs قتل 

استخدام الأنابيب لأخذ إخراج lsof إلى awk ومن awk إلى xargs والقتل ، لمقبس UDP

ومع ذلك ، لا يتعرف lsof على بروتوكول SCTP.

 lsof -i sctp: 7889 

lsof لا يعمل مع بروتوكول SCTP

يمكننا استخدام الأمر ss للقيام بذلك. نحن نستخدم الخيار -S (SCTP) للبحث عن مآخذ SCTP ، وخيار -a (الكل) للبحث عن جميع أنواع المقابس (الاستماع ، والقبول ، والاتصال ، وما إلى ذلك) ، وخيار -p (العمليات) لسرد تفاصيل العملية باستخدام المقبس.

 ss -Sap 

طباعة تفاصيل عملية باستخدام مقبس SCTP مع ss

يمكننا تحليل هذا الناتج باستخدام grep و awk . يمكننا أيضًا تحليلها باستخدام grep وبعض regexes PERL ، ولكن هذه الطريقة أسهل في الفهم. إذا كنت ستستخدم هذا أكثر من مرة أو مرتين ، فمن المحتمل أن تقوم بإنشاء اسم مستعار أو وظيفة shell منه.

سنقوم بتوجيه الإخراج من ss إلى grep والبحث عن رقم المنفذ ، 7889. سنقوم بتوجيه الإخراج من grep إلى awk . في awk ، نستخدم الخيار -F (سلسلة فاصلة) لتعيين فاصلة " , " كمحدد للحقل. نبحث عن سلسلة تحتوي على "pid =" ، ونطبع الحقل الثاني المحدد بفاصلة من تلك السلسلة.

 ss -Sap | grep "7889" | awk -F '،' '/ pid = / {print $ 2}' 

استخدام الأنابيب لتوصيل ss و grep و awk لاستخراج سلسلة PID

أعطانا ذلك السلسلة "pid = 2859".

يمكننا توجيه ذلك إلى awk مرة أخرى ، وتعيين محدد الحقل إلى علامة يساوي " = " وطباعة الحقل الثاني من تلك السلسلة ، والذي سيكون النص الموجود خلف علامة التساوي.

 ss -Sap | grep "7889" | awk -F '،' '/ pid = / {print $ 2}' | awk -F '= "{print $ 2}" 

استخدام الأنابيب لتوصيل ss و grep و awk مرتين لاستخراج PID

لقد قمنا الآن بعزل معرف العملية. يمكننا استخدام xargs لتمرير PID kill كمعامل سطر أوامر.

 ss -Sap | grep "7889" | awk -F '،' '/ pid = / {print $ 2}' | awk -F '=' '{print $ 2}' | xargs قتل 

استخدام الأنابيب مع ss و grep و awk و xargs لإنهاء عملية مأخذ توصيل SCTP

هذا يقتل العملية التي كانت تستخدم مقبس بروتوكول SCTP على المنفذ 7889.

قيادة المنصهر

يبسط أمر fuser الأشياء إلى حد كبير. الجانب السلبي هو أنه يعمل فقط مع مآخذ TCP و UDP. على الجانب الإيجابي ، هذان هما النوعان الأكثر شيوعًا من المقابس التي ستحتاج إلى التعامل معها. تم بالفعل تثبيت أمر fuser على أجهزة كمبيوتر Ubuntu و Fedora و Manjaro التي فحصناها.

كل ما عليك فعله هو استخدام الخيار -k (kill) ، وتوفير المنفذ والبروتوكول. يمكنك إما استخدام الخيار -n (مساحة الاسم) وتوفير البروتوكول والمنفذ ، أو استخدام "تنسيق اختصار الشرطة المائلة للأمام" ووضع رقم المنفذ أولاً.

 المنصهر - n tcp 7889
 وحدة المصهر 7889 / udp 

استخدام الأمر fuser لحذف العمليات باستخدام مآخذ TCP و UDP

تتم طباعة رقم المنفذ والبروتوكول ومعرف المنتج للعملية المنتهية في نافذة المحطة الطرفية.

جرب وحدة المصهر أولاً

من المحتمل أن يتم تثبيته على الكمبيوتر الذي تعمل عليه ، ومن المحتمل أن يكون البروتوكول TCP أو UDP ، لذلك هناك فرصة كبيرة لأن أبسط طريقة ستعمل من أجلك.