روابط سريعة
لقتل عملية Linux، تحتاج إلى معرفها أو اسمها. إذا كان كل ما تعرفه هو المنفذ الذي تستخدمه، فهل لا يزال بإمكانك قتلها؟ نعم، بعدة طرق مختلفة.
عمليات القتل
في بعض الأحيان، قد تتوقف عملية Linux عن الاستجابة. فقد تتوقف عن العمل بشكل صحيح، أو قد تستمر في العمل ولكنها تتجاهل طلبات إيقاف تشغيلها، أو تبدأ في استهلاك الذاكرة أو وحدة المعالجة المركزية أو عرض النطاق الترددي للشبكة.
أياً كانت دوافعك، فهناك طرق لقتل عملية من سطر أوامر لينكس. الطريقة الكلاسيكية هي استخدام أمر القتل مع معرف العملية التي تريد إنهاؤها. kill الأمر له بعض الأقارب المقربين.
pkill
سيؤدي الأمر إلى قتل عملية حسب الاسم، و
killall
سيؤدي ذلك إلى قتل جميع العمليات التي يمكنها العثور عليها والتي تشترك في جزء من الاسم.
إذا كان كل ما تعرفه عن عملية ما هو أنها تستخدم منفذًا على جهاز الكمبيوتر الخاص بك، فلا يزال هناك طرق لتحديدها وإيقافها. في مصطلحات الشبكات، يمكن أن تعني “المنفذ” اتصالاً ماديًا تقوم بإدخال كبل به قابس في نهايته، مثل كابل شبكة CAT5 أو 6أو يمكن أن يعني منفذ برمجي.
منفذ البرنامج هو الجزء الأخير من اتصال الشبكة. يحدد عنوان IP الخاص بجهاز الكمبيوتر أو أي جهاز شبكة آخر. تستخدم التطبيقات داخل الكمبيوتر منافذ مختلفة. توفر هذه المنافذ مستوى آخر من التفصيل. تصل حركة المرور عبر الشبكة إلى الكمبيوتر الصحيح باستخدام عنوان IP، وباستخدام تحديد المنافذ يمكن توصيلها إلى التطبيق الصحيح.
الأمر أشبه بوصول البريد العادي إلى الفندق، ثم فرزه وتسليمه إلى الغرف المناسبة. عنوان IP يشبه عنوان الشارع الذي يقع فيه الفندق، وأرقام الغرف تشبه أرقام المنافذ.
إذا لاحظت نشاطًا شبكيًا على منفذ ولم تتعرف على العملية التي تولِّده، أو كان سلوكها إشكاليًا أو مريبًا، فقد ترغب في قتل العملية. حتى إذا كان كل ما تعرفه هو رقم المنفذ، فيمكنك تعقب العملية وقتلها.
إنشاء اتصالات مع socat
لكي يكون لدينا بعض الاتصالات التي يجب قتلها، سنستخدم socat لإنشاء اتصالات الشبكة باستخدام بروتوكولات مختلفة. ستحتاج إلى تثبيت socat لتثبيته على أوبونتو، استخدم هذا الأمر:
sudo apt install socat
حول استخدام فيدورا dnf:
sudo dnf install 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 &
سننشئ اتصالين آخرين حتى يكون لدينا مجموعة صغيرة من المقابس التي تستخدم بروتوكولات مختلفة. سننشئ اتصال UDP و اتصال SCTPالجزء الوحيد الذي يتغير في الأمر هو البروتوكول.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
استخدام Kill
بالطبع، يمكننا أن نستخدم kill لإنهاء العملية، طالما أننا نعرف معرف العملية. للعثور على معرف العملية، يمكننا استخدام lsof يأمر.
لإدراج تفاصيل العملية على المنفذ 7889 التي تستخدم بروتوكول TCP، نستخدم -i خيار (عنوان الإنترنت) مثل هذا.
lsof -i tcp:7889
معرف العملية لهذه العملية هو 3141، ويمكننا المضي قدمًا واستخدامه مع kill:
sudo kill 3141
يمكننا توفير بعض الجهد على أنفسنا إذا استخدمنا الأنابيب. إذا قمنا بتوصيل مخرجات lsof داخل awk وأخبر awk للبحث عن الأسطر التي تحتوي على المنفذ الذي نهتم به—7889—وطباعة الحقل الثاني من هذا السطر، سنقوم بعزل PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
يمكننا بعد ذلك توجيه الإخراج من awk الى داخل kill الأمر باستخدام xargs. ال xargs يأخذ الأمر مدخلاته الموجهة ويمررها إلى أمر آخر كمعلمات لسطر الأوامر. سنستخدم xargs مع kill يأمر.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
لا نحصل على أي ملاحظات مرئية. وفقًا لطريقة Linux النموذجية، فإن عدم وجود أخبار يعد خبرًا جيدًا. إذا كنت تريد التحقق من إنهاء العملية، فيمكنك استخدام lsof مرة أخرى.
lsof -i tcp:7889
لأن lsof لا يبلغ عن أي شيء، ونحن نعلم أنه لا يوجد مثل هذا الارتباط.
يمكننا إزالة عملية باستخدام بروتوكول UDP ببساطة عن طريق استبدال “tcp” بـ “udp” في أمرنا السابق.
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
لكن، lsof لا يتعرف على بروتوكول SCTP.
lsof -i sctp:7889
يمكننا استخدام ss الأمر للقيام بذلك. نحن نستخدم -S (SCTP) خيار للبحث عن مآخذ SCTP، -a (الكل) خيار للبحث عن جميع أنواع المقابس (الاستماع، والقبول، والمتصلة، وما إلى ذلك)، و -p خيار (العمليات) لإدراج تفاصيل العملية باستخدام المقبس.
ss -Sap
يمكننا تحليل هذا الناتج باستخدام grep و awk يمكننا أيضًا تحليله باستخدام grep وبعض تعبيرات PERL العادية، ولكن هذه الطريقة أسهل كثيرًا في الفهم. إذا كنت ستستخدم هذه الطريقة أكثر من مرة أو مرتين، فمن المحتمل أن تقوم بإنشاء اسم مستعار أو وظيفة غلاف منها.
سوف نقوم بنقل الناتج من ss داخل grep وابحث عن رقم المنفذ الخاص بنا، 7889. وسنقوم بنقل الإخراج من grep داخل awk. في awkنحن نستخدم -F (سلسلة فاصلة) خيار لتعيين فاصلة “,“كفاصل للحقل. نبحث عن سلسلة تحتوي على “pid=”، ونطبع الحقل الثاني المفصول بفاصلة من تلك السلسلة.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'
لقد أعطانا هذا السلسلة “pid=2859”.
يمكننا أن ننقل ذلك إلى awk مرة أخرى، قم بتعيين فاصل الحقل إلى علامة المساواة “=“وطباعة الحقل الثاني من هذا السلسلة، والذي سيكون النص خلف علامة التساوي.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
لقد قمنا الآن بعزل معرف العملية. يمكننا استخدام xargs لتمرير معرف العملية إلى kill كمعلمة لسطر الأوامر.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
يؤدي هذا إلى قتل العملية التي كانت تستخدم مقبس بروتوكول SCTP على المنفذ 7889.
أمر التثبيت
ال fuser الأمر يبسط الأمور كثيرًا. الجانب السلبي هو أنه يعمل فقط مع مآخذ TCP وUDP. على الجانب الإيجابي، هذان هما النوعان الأكثر شيوعًا من المآخذ التي ستحتاج إلى التعامل معها. fuser لقد تم تثبيت الأمر بالفعل على أجهزة الكمبيوتر Ubuntu وFedora وManjaro التي قمنا بفحصها.
كل ما عليك فعله هو استخدام -k خيار (القتل)، وتوفير المنفذ والبروتوكول. يمكنك استخدام -n خيار (namespace) وتوفير البروتوكول والمنفذ، أو استخدم “تنسيق الاختصار المائل للأمام” ووضع رقم المنفذ أولاً.
fuser -n tcp 7889
fuser 7889/udp
يتم طباعة رقم المنفذ والبروتوكول ومعرف العملية المنتهية في نافذة المحطة الطرفية.
جرب التثبيت أولاً
من المحتمل أن يتم تثبيته على الكمبيوتر الذي تعمل عليه، ومن المرجح أن يكون البروتوكول هو TCP أو UDP، لذا هناك فرصة كبيرة لأن الطريقة الأبسط ستنجح معك.
