تخطَّ إلى المحتوى

العمليات في Linux: ps و top و kill

الدرس 8 من 10 · أساسيات Linux

برنامج توقف عن الاستجابة ويرفض الإغلاق. خادم صار بطيئاً فجأة ولا تعرف ما الذي يستهلك المعالج. سكربت طويل تريد تشغيله دون أن يحتل الطرفية. كلها مواقف تحتاج فيها أن ترى ما يعمل على النظام وتتحكم فيه. في هذا الدرس ستتعلم التعامل مع العمليات (Processes): عرضها، وإيقافها، وتشغيلها في الخلفية.

العملية برنامج قيد التشغيل. الملف firefox على القرص برنامج، وعندما تشغّله يصبح عملية تأخذ ذاكرة ووقتاً من المعالج. ولو فتحت المتصفح مرتين فعندك عمليتان من البرنامج نفسه.

لكل عملية رقم فريد اسمه PID (Process ID)، وبه تشير إليها في كل الأوامر. الأمر مثل الطهاة في مطبخ مطعم: كتاب الوصفات هو البرنامج، وكل طاهٍ يطبخ الآن هو عملية، ولكل طاهٍ رقم على مريوله.

نافذة طرفيّة
ps
شكل الناتج
PID TTY TIME CMD
2140 pts/0 00:00:00 bash
2315 pts/0 00:00:00 ps

ps وحده يعرض عمليات طرفيتك الحالية فقط: الصدفة bash، والأمر ps نفسه. (الأرقام ستختلف على جهازك في كل مرة.)

لرؤية كل عمليات النظام:

نافذة طرفيّة
ps aux
شكل الناتج
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 167744 11520 ? Ss 09:00 0:01 /sbin/init
root 612 0.0 0.2 52340 18200 ? Ss 09:00 0:00 /usr/sbin/sshd
sara 2140 0.0 0.0 10124 5120 pts/0 Ss 10:15 0:00 bash
sara 2290 3.5 4.2 982340 340120 ? Sl 10:20 1:12 node server.js
sara 2316 0.0 0.0 12088 3200 pts/0 R+ 10:31 0:00 ps aux

أهم الأعمدة:

العمود المعنى
USER صاحب العملية
PID رقمها الفريد
%CPU و %MEM نسبة استهلاكها من المعالج والذاكرة
COMMAND الأمر الذي شغّلها

القائمة الحقيقية فيها مئات الأسطر، ولهذا نصفّيها بما تعلمته في الدرسين السابقين:

نافذة طرفيّة
ps aux | grep node

يعرض الأسطر التي فيها node فقط. والأقصر منه pgrep node الذي يطبع أرقام العمليات المطابقة مباشرة.

ps صورة ثابتة للحظة واحدة. أما top فشاشة حية تتحدث كل بضع ثوانٍ، والعمليات فيها مرتبة حسب استهلاك المعالج:

نافذة طرفيّة
top

في أعلى الشاشة ملخص: عدد العمليات، وحمل المعالج، والذاكرة المستخدمة والحرة. وتحته جدول العمليات. بعض المفاتيح المفيدة داخله:

المفتاح الوظيفة
q الخروج
M الترتيب حسب الذاكرة
P الترتيب حسب المعالج
k إيقاف عملية برقمها

top مثل لوحة عدادات السيارة: نظرة واحدة تخبرك هل المحرك يعمل بهدوء أم يكاد يحترق.

نافذة طرفيّة
kill 2290

رغم اسمه العنيف، kill في الحقيقة يرسل إشارة (Signal) إلى العملية. الإشارة الافتراضية اسمها SIGTERM ومعناها: «من فضلك أنهِ عملك وأغلق». العملية تستقبلها، فتحفظ بياناتها وتغلق ملفاتها ثم تخرج بهدوء.

وإذا كانت العملية معلّقة ولا تستجيب؟ عندها الإشارة التي لا تُرفض:

نافذة طرفيّة
kill -9 2290

-9 هي SIGKILL: النظام ينهي العملية فوراً دون أن يعطيها فرصة لأي شيء.

الإشارة الأمر المعنى
SIGTERM (15) kill PID طلب مهذب بالإغلاق. جرّبها أولاً دائماً
SIGKILL (9) kill -9 PID إنهاء إجباري فوري. الملاذ الأخير
SIGINT (2) Ctrl + C مقاطعة الأمر العامل في الطرفية

ولإيقاف العمليات بالاسم بدل الرقم: pkill node يرسل الإشارة لكل عملية اسمها node. وتستطيع إيقاف عملياتك أنت فقط؛ عمليات المستخدمين الآخرين والنظام تحتاج sudo.

الأمر العادي يحتل الطرفية حتى ينتهي. أضف & في آخره ليعمل في الخلفية وتعود لك الطرفية فوراً. سنجرّب بالأمر sleep 300 الذي لا يفعل شيئاً سوى الانتظار خمس دقائق:

نافذة طرفيّة
sleep 300 &
شكل الناتج
[1] 2412

[1] رقم المهمة (Job) في هذه الطرفية، و 2412 رقم العملية. لعرض مهام الخلفية:

نافذة طرفيّة
jobs
الناتج
[1]+ Running sleep 300 &

ولإيقاف مهمة برقمها استخدم علامة %:

نافذة طرفيّة
kill %1
jobs
شكل الناتج
[1]+ Terminated sleep 300

شغّلت أمراً طويلاً ونسيت &؟ لا تلغه:

  1. اضغط Ctrl + Z: يتوقف الأمر مؤقتاً وتعود الطرفية، وتظهر رسالة فيها Stopped.
  2. اكتب bg: يكمل الأمر عمله في الخلفية.
  3. واكتب fg متى أردت إعادته إلى الواجهة.
الأمر أو الاختصار الوظيفة
command & شغّل في الخلفية من البداية
Ctrl + Z أوقف الأمر الحالي مؤقتاً
bg أكمل المهمة المتوقفة في الخلفية
fg أعد المهمة إلى الواجهة
Ctrl + C ألغِ الأمر الحالي نهائياً

كل عملية تترك عند انتهائها رقماً اسمه رمز الخروج (Exit Code): صفر يعني النجاح، وأي رقم آخر يعني خطأ. والمتغير الخاص $? يحمل رمز آخر أمر:

نافذة طرفيّة
ls nothing.txt 2> /dev/null
echo $?
الناتج
2

ستعتمد على هذا الرقم كثيراً في درس السكربتات، لتعرف هل نجحت الخطوة السابقة قبل الانتقال للتالية.

  1. شغّل ps ثم ps aux | wc -l لتعرف عدد العمليات على جهازك.
  2. شغّل sleep 200 & مرتين، واعرضهما بـ jobs، ثم أوقف الأولى بـ kill %1.
  3. شغّل sleep 100 بدون &، ثم أوقفه مؤقتاً بـ Ctrl + Z، وأكمله في الخلفية بـ bg، ثم أعده بـ fg وألغه بـ Ctrl + C.
  4. تحدٍّ: افتح top، ورتّب العمليات حسب الذاكرة، واكتب اسم أكثر عملية استهلاكاً ثم اخرج.
  • kill -9 من أول مرة: قد يُتلف بيانات البرنامج. ابدأ بـ kill العادي.
  • الخلط بين رقم المهمة ورقم العملية: kill 1 يستهدف العملية رقم 1 (أساس النظام!)، أما kill %1 فيستهدف مهمتك الأولى. لا تنسَ علامة %.
  • إيقاف عملية لا تعرفها: بعض العمليات أساسية للنظام. ابحث عن اسمها قبل إيقافها.
  • إغلاق الطرفية ومهمة طويلة تعمل: تتوقف المهمة. استخدم nohup.

سؤال

ما الفرق بين kill PID و kill -9 PID؟

سؤال

ماذا تفعل العلامة & في آخر الأمر؟

  • العملية برنامج قيد التشغيل، ولكل عملية رقم فريد PID.
  • ps aux يعرض كل العمليات، و top يراقبها حيّة مرتبة بالاستهلاك.
  • kill PID يطلب الإغلاق بلطف، و kill -9 للإنهاء الإجباري عند الضرورة.
  • & للتشغيل في الخلفية، و jobs و fg و bg و Ctrl + Z للتحكم في المهام.
  • $? رمز خروج آخر أمر: صفر للنجاح وغيره للخطأ.