انتقل إلى المحتوى الرئيسي

المختبر 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)
  • فهم الإشارات المختلفة
  • إدارة العمليات بشكل عملي

أسئلة للتفكير​

  1. ما الفرق بين SIGTERM و SIGKILL؟

    • SIGTERM: إنهاء برفق (يمكن اعتراضه)
    • SIGKILL: إنهاء بالقوة (لا يمكن تجاهله)
  2. لماذا نستخدم nohup؟

    • يسمح للعملية بالاستمرار بعد تسجيل الخروج من الطرفية
    • مفيد للمهام الطويلة
  3. ما هو عملية الزومبي؟

    • عملية انتهت ولكن الوالد لم يقم بـ wait()
    • يتم تنظيفها تلقائيًا بواسطة init

الخطوات التالية​

  • المختبر 4.3: الأولويات وقيم Nice
  • المختبر 4.4: الوظائف والمهام في الخلفية
  • الفصل 4.2: تصور العمليات

تم إنشاء المختبر في: ديسمبر 2024 - تم اختباره على أوبونتو 24.04