العمليات في Linux: ps و top و kill
برنامج توقف عن الاستجابة ويرفض الإغلاق. خادم صار بطيئاً فجأة ولا تعرف ما الذي يستهلك المعالج. سكربت طويل تريد تشغيله دون أن يحتل الطرفية. كلها مواقف تحتاج فيها أن ترى ما يعمل على النظام وتتحكم فيه. في هذا الدرس ستتعلم التعامل مع العمليات (Processes): عرضها، وإيقافها، وتشغيلها في الخلفية.
ما هي العملية؟
Section titled “ما هي العملية؟”العملية برنامج قيد التشغيل. الملف firefox على القرص برنامج، وعندما تشغّله يصبح عملية تأخذ ذاكرة ووقتاً من المعالج. ولو فتحت المتصفح مرتين فعندك عمليتان من البرنامج نفسه.
لكل عملية رقم فريد اسمه PID (Process ID)، وبه تشير إليها في كل الأوامر. الأمر مثل الطهاة في مطبخ مطعم: كتاب الوصفات هو البرنامج، وكل طاهٍ يطبخ الآن هو عملية، ولكل طاهٍ رقم على مريوله.
ps: ما الذي يعمل الآن؟
Section titled “ps: ما الذي يعمل الآن؟”ps PID TTY TIME CMD 2140 pts/0 00:00:00 bash 2315 pts/0 00:00:00 psps وحده يعرض عمليات طرفيتك الحالية فقط: الصدفة bash، والأمر ps نفسه. (الأرقام ستختلف على جهازك في كل مرة.)
لرؤية كل عمليات النظام:
ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 167744 11520 ? Ss 09:00 0:01 /sbin/initroot 612 0.0 0.2 52340 18200 ? Ss 09:00 0:00 /usr/sbin/sshdsara 2140 0.0 0.0 10124 5120 pts/0 Ss 10:15 0:00 bashsara 2290 3.5 4.2 982340 340120 ? Sl 10:20 1:12 node server.jssara 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 الذي يطبع أرقام العمليات المطابقة مباشرة.
top: مراقبة حية
Section titled “top: مراقبة حية”ps صورة ثابتة للحظة واحدة. أما top فشاشة حية تتحدث كل بضع ثوانٍ، والعمليات فيها مرتبة حسب استهلاك المعالج:
topفي أعلى الشاشة ملخص: عدد العمليات، وحمل المعالج، والذاكرة المستخدمة والحرة. وتحته جدول العمليات. بعض المفاتيح المفيدة داخله:
| المفتاح | الوظيفة |
|---|---|
q |
الخروج |
M |
الترتيب حسب الذاكرة |
P |
الترتيب حسب المعالج |
k |
إيقاف عملية برقمها |
top مثل لوحة عدادات السيارة: نظرة واحدة تخبرك هل المحرك يعمل بهدوء أم يكاد يحترق.
kill: إيقاف عملية
Section titled “kill: إيقاف عملية”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.
التشغيل في الخلفية: &
Section titled “التشغيل في الخلفية: &”الأمر العادي يحتل الطرفية حتى ينتهي. أضف & في آخره ليعمل في الخلفية وتعود لك الطرفية فوراً. سنجرّب بالأمر sleep 300 الذي لا يفعل شيئاً سوى الانتظار خمس دقائق:
sleep 300 &[1] 2412[1] رقم المهمة (Job) في هذه الطرفية، و 2412 رقم العملية. لعرض مهام الخلفية:
jobs[1]+ Running sleep 300 &ولإيقاف مهمة برقمها استخدم علامة %:
kill %1jobs[1]+ Terminated sleep 300fg و bg و Ctrl + Z
Section titled “fg و bg و Ctrl + Z”شغّلت أمراً طويلاً ونسيت &؟ لا تلغه:
- اضغط Ctrl + Z: يتوقف الأمر مؤقتاً وتعود الطرفية، وتظهر رسالة فيها
Stopped. - اكتب
bg: يكمل الأمر عمله في الخلفية. - واكتب
fgمتى أردت إعادته إلى الواجهة.
| الأمر أو الاختصار | الوظيفة |
|---|---|
command & |
شغّل في الخلفية من البداية |
| Ctrl + Z | أوقف الأمر الحالي مؤقتاً |
bg |
أكمل المهمة المتوقفة في الخلفية |
fg |
أعد المهمة إلى الواجهة |
| Ctrl + C | ألغِ الأمر الحالي نهائياً |
رمز الخروج
Section titled “رمز الخروج”كل عملية تترك عند انتهائها رقماً اسمه رمز الخروج (Exit Code): صفر يعني النجاح، وأي رقم آخر يعني خطأ. والمتغير الخاص $? يحمل رمز آخر أمر:
ls nothing.txt 2> /dev/nullecho $?2ستعتمد على هذا الرقم كثيراً في درس السكربتات، لتعرف هل نجحت الخطوة السابقة قبل الانتقال للتالية.
جرّب بنفسك
Section titled “جرّب بنفسك”- شغّل
psثمps aux | wc -lلتعرف عدد العمليات على جهازك. - شغّل
sleep 200 &مرتين، واعرضهما بـjobs، ثم أوقف الأولى بـkill %1. - شغّل
sleep 100بدون&، ثم أوقفه مؤقتاً بـ Ctrl + Z، وأكمله في الخلفية بـbg، ثم أعده بـfgوألغه بـ Ctrl + C. - تحدٍّ: افتح
top، ورتّب العمليات حسب الذاكرة، واكتب اسم أكثر عملية استهلاكاً ثم اخرج.
أخطاء شائعة
Section titled “أخطاء شائعة”kill -9من أول مرة: قد يُتلف بيانات البرنامج. ابدأ بـkillالعادي.- الخلط بين رقم المهمة ورقم العملية:
kill 1يستهدف العملية رقم 1 (أساس النظام!)، أماkill %1فيستهدف مهمتك الأولى. لا تنسَ علامة%. - إيقاف عملية لا تعرفها: بعض العمليات أساسية للنظام. ابحث عن اسمها قبل إيقافها.
- إغلاق الطرفية ومهمة طويلة تعمل: تتوقف المهمة. استخدم
nohup.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الفرق بين kill PID و kill -9 PID؟
الافتراضي SIGTERM طلب مهذب يسمح بالحفظ والتنظيف، و SIGKILL إنهاء فوري لا يُرفض.
سؤال
ماذا تفعل العلامة & في آخر الأمر؟
الأمر يعمل في الخلفية كمهمة تراها بـ jobs، وتستطيع متابعة العمل في الطرفية.
الخلاصة
Section titled “الخلاصة”- العملية برنامج قيد التشغيل، ولكل عملية رقم فريد PID.
ps auxيعرض كل العمليات، وtopيراقبها حيّة مرتبة بالاستهلاك.kill PIDيطلب الإغلاق بلطف، وkill -9للإنهاء الإجباري عند الضرورة.&للتشغيل في الخلفية، وjobsوfgوbgو Ctrl + Z للتحكم في المهام.$?رمز خروج آخر أمر: صفر للنجاح وغيره للخطأ.