المختبر 4.2 - التحكم في العمليات
الأهداف
في نهاية هذا المختبر، ستكون قادرًا على:
- بدء العمليات
- إيقاف العمليات (kill، killall، pkill)
- تعليق واستئناف العمليات
- إدارة الوظائف في الخلفية
- فهم إشارات لينكس
المتطلبات
- تثبيت أوبونتو 24.04
- فتح الطرفية
- وصول مستخدم عادي
التمرين 1: بدء العمليات
الخطوة 1: عملية في المقدمة
# تشغيل عملية بسيطة
sleep 60
# تشغيل عملية تفاعلية
nano test.txt
# (Ctrl+X للخروج)
الخطوة 2: عملية في الخلفية
# تشغيل في الخلفية باستخدام &
sleep 300 &
# رؤية PID
echo $!
# رؤية الوظائف
jobs
# رؤية العمليات في الخلفية
ps aux | grep sleep
الخطوة 3: nohup
# تشغيل عملية تستمر بعد تسجيل الخروج
nohup sleep 600 > sleep.log 2>&1 &
# التحقق
ps aux | grep sleep
cat sleep.log
التمرين 2: إشارات لينكس
الخطوة 1: فهم الإشارات
# رؤية جميع الإشارات
kill -l
# الإشارات الشائعة:
# SIGTERM (15): إنهاء برفق
# SIGKILL (9): إنهاء بالقوة (لا يمكن تجاهله)
# SIGSTOP (19): تعليق
# SIGCONT (18): استئناف
# SIGHUP (1): تعليق (إعادة التشغيل)
الخطوة 2: إرسال الإشارات
# تشغيل عملية
sleep 300 &
PID=$!
# إرسال SIGTERM (إنهاء برفق)
kill $PID
# أو مع الرقم
kill -15 $PID
# التحقق
ps -p $PID
التمرين 3: kill، killall، pkill
الخطوة 1: kill
# تشغيل عدة عمليات
sleep 100 &
PID1=$!
sleep 200 &
PID2=$!
# قتل عملية محددة
kill $PID1
# قتل عدة عمليات
kill $PID1 $PID2
# قتل بالقوة (SIGKILL)
kill -9 $PID1
الخطوة 2: killall
# تشغيل عدة مثيلات
sleep 100 &
sleep 200 &
sleep 300 &
# قتل جميع عمليات "sleep"
killall sleep
# مع التأكيد
killall -i sleep
# التحقق
ps aux | grep sleep
الخطوة 3: pkill
# تشغيل عمليات
sleep 100 &
sleep 200 &
# قتل بالاسم (نمط)
pkill sleep
# قتل بواسطة المستخدم
pkill -u $USER sleep
# رؤية ما سيتم قتله (تجربة جافة)
pkill -l sleep
التمرين 4: تعليق واستئناف
الخطوة 1: تعليق عملية
# تشغيل عملية
sleep 300 &
# تعليق باستخدام kill
kill -STOP $!
# أو باستخدام Ctrl+Z (إذا كان في المقدمة)
# sleep 300
# [اضغط Ctrl+Z]
# رؤية الحالة
ps aux | grep sleep
# لاحظ "T" (متوقف)
الخطوة 2: استئناف عملية
# استئناف في الخلفية
kill -CONT $PID
# استئناف في المقدمة
fg
# استئناف في الخلفية
bg
التمرين 5: إدارة الوظائف
الخطوة 1: أوامر الوظائف
# تشغيل عدة وظائف
sleep 100 &
sleep 200 &
sleep 300 &
# رؤية الوظائف
jobs
# رؤية مع PID
jobs -l
# جلب وظيفة إلى المقدمة
fg %1 # وظيفة رقم 1
# وضع في الخلفية
bg %1
# قتل وظيفة
kill %1
الخطوة 2: سكربت مع الوظائف
# إنشاء سكربت
cat > test-jobs.sh << 'EOF'
#!/bin/bash
sleep 10 &
JOB1=$!
sleep 20 &
JOB2=$!
echo "الوظائف التي تم تشغيلها: $JOB1, $JOB2"
jobs
# انتظار الانتهاء
wait $JOB1
echo "الوظيفة 1 انتهت"
wait $JOB2
echo "الوظيفة 2 انتهت"
EOF
chmod +x test-jobs.sh
./test-jobs.sh
التمرين 6: عملية الزومبي
الخطوة 1: إنشاء زومبي (للاختبار)
# سكربت ينشئ زومبي
cat > zombie.sh << 'EOF'
#!/bin/bash
# تفرع عملية طفل تموت فورًا
# الوالد لا يقوم بـ wait()
(
sleep 1
exit
) &
# الوالد لا يقوم بـ wait، الطفل يصبح زومبي
sleep 10
EOF
chmod +x zombie.sh
./zombie.sh &
# رؤية الزومبي
ps aux | grep -w Z
الخطوة 2: تنظيف الزومبي
# يتم تنظيف الزومبي تلقائيًا بواسطة init (PID 1)
# لكن يمكننا إجبار الوالد على القتل
ps aux | grep zombie
# العثور على PID الوالد وقتله
التمرين 7: ممارسة كاملة
الخطوة 1: سيناريو حقيقي
# تشغيل خادم ويب للاختبار
python3 -m http.server 8000 &
SERVER_PID=$!
# التحقق من أنه يعمل
ps -p $SERVER_PID
curl http://localhost:8000
# إيقاف برفق
kill $SERVER_PID
# التحقق
ps -p $SERVER_PID
الخطوة 2: سكربت إدارة
# سكربت لإدارة عملية
cat > manage-process.sh << 'EOF'
#!/bin/bash
PROCESS="python3"
ACTION=$1
case $ACTION in
start)
python3 -m http.server 8000 > /dev/null 2>&1 &
echo "الخادم بدأ: $!"
;;
stop)
pkill -f "python3 -m http.server"
echo "الخادم توقف"
;;
status)
if pgrep -f "python3 -m http.server" > /dev/null; then
echo "الخادم نشط"
ps aux | grep "python3 -m http.server" | grep -v grep
else
echo "الخادم غير نشط"
fi
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "الاستخدام: $0 {start|stop|status|restart}"
exit 1
;;
esac
EOF
chmod +x manage-process.sh
# الاستخدام
./manage-process.sh start
./manage-process.sh status
./manage-process.sh stop
التحقق
قائمة التحقق
تحقق من أنك تستطيع:
- بدء العمليات (المقدمة والخلفية)
- إرسال الإشارات (kill، killall، pkill)
- تعليق واستئناف العمليات
- إدارة الوظائف (jobs، fg، bg)
- فهم الإشارات المختلفة
- إدارة العمليات بشكل عملي
أسئلة للتفكير
-
ما الفرق بين SIGTERM و SIGKILL؟
- SIGTERM: إنهاء برفق (يمكن اعتراضه)
- SIGKILL: إنهاء بالقوة (لا يمكن تجاهله)
-
لماذا نستخدم nohup؟
- يسمح للعملية بالاستمرار بعد تسجيل الخروج من الطرفية
- مفيد للمهام الطويلة
-
ما هو عملية الزومبي؟
- عملية انتهت ولكن الوالد لم يقم بـ wait()
- يتم تنظيفها تلقائيًا بواسطة init
الخطوات التالية
- المختبر 4.3: الأولويات وقيم Nice
- المختبر 4.4: الوظائف والمهام في الخلفية
- الفصل 4.2: تصور العمليات
تم إنشاء المختبر في: ديسمبر 2024 - تم اختباره على أوبونتو 24.04