Logo

أوامر Linux - الجزء الثاني: العمليات وأوامر DevOps

19 دقيقة قراءة
شرائح الدرس
1 / 18

نظم التشغيل 1 - الدرس العاشر

أوامر Linux - الجزء الثاني: الـ Processes وأوامر DevOps

فحص الـ processes الجارية والتحكم فيها، ثم استخدام مجموعة أوامر DevOps الأساسية للصلاحيات ومعالجة النصوص ومعلومات النظام والشبكة.

بنهاية هذا الدرس ستكون قادرا على فحص العمليات الجارية على Linux والتحكم فيها، واستخدام مجموعة أوامر DevOps الأساسية لإدارة الصلاحيات ومعالجة النصوص ومعرفة معلومات النظام والشبكة.

الأهداف

  • تحديد الـ process وحالاته المختلفة، وقراءة مخرجات ps، ps -u، ps -A، ps aux، و top.
  • إرسال الـ signals باستخدام kill، kill -9، kill -L، و pkill، وضبط أولوية العملية باستخدام nice و renice.
  • توضيح معنى DevOps وسبب استبداله لنموذج التطوير والتشغيل المنفصل القديم.
  • استخدام مجموعة أوامر DevOps الأساسية: sudo، chown، id، find، grep، tail، sort، cut، tr، sed، diff، dd، tar/gzip، df، du، free، ifconfig، ping، telnet، hostname، و history.

المتطلبات السابقة

  • طرفية Linux تعمل بشكل سليم (تثبيت أصلي، أو جهاز افتراضي، أو WSL).
  • إجادة أوامر التنقل الأساسية (pwd، cd، ls، mkdir، cp، mv، rm) والتعامل مع cat و chmod.
  • حساب مستخدم عادي يملك صلاحية sudo، مطلوب في عدد قليل من الخطوات.
  • اتصال شبكة نشط، مطلوب لخطوات ping و telnet.
  • telnet، غير مثبت بشكل افتراضي على بعض توزيعات Linux الصغيرة (بما فيها بعض صور WSL)؛ إذا لم يكن الأمر موجودا، ثبت حزمة العميل التي توفرها توزيعتك له.
  • ifconfig، لا تثبته بعض توزيعات Linux الأحدث أو الصغيرة (بما فيها بعض صور WSL) بشكل افتراضي؛ إذا لم يكن الأمر موجودا، ثبت الحزمة التي توفرها توزيعتك له.

ما هي العملية

الـ process هي برنامج قيد التنفيذ. في اللحظة التي تشغل فيها أمرا، يحمله نظام التشغيل إلى الذاكرة، ويعطيه رقم عملية (Process ID / PID) فريدا، ويبدأ في تتبعه. كل أمر تكتبه يبدأ عملية واحدة على الأقل.

عمليات Linux تنقسم إلى نوعين:

  • عمليات المقدمة (foreground)، وتسمى أيضا التفاعلية (interactive)، تعتمد على المستخدم لإدخال البيانات؛ تنتظر الطرفية انتهاءها قبل قبول أمر جديد.
  • عمليات الخلفية (background)، وتسمى أيضا غير التفاعلية أو الآلية، تعمل بشكل مستقل؛ الطرفية تكون حرة في قبول أوامر جديدة أثناء عملها.

تمر العملية أيضا بمجموعة صغيرة من الحالات بين لحظة إنشائها ولحظة انتهائها:

  • Running: قيد التنفيذ، أو جاهزة للتنفيذ.
  • Sleeping: في انتظار مورد (disk، network، إدخال من المستخدم). تنقسم إلى interruptible sleep، التي تستيقظ للتعامل مع signal، و uninterruptible sleep، التي لا تستيقظ.
  • Stopped: متوقفة مؤقتا بعد استقبال stop signal.
  • Zombie: انتهى تنفيذها، لكن سجلها يبقى في جدول العمليات.
stateDiagram-v2
    [*] --> Running
    Running --> Sleeping: waiting for a resource
    Sleeping --> Running: resource becomes available
    Running --> Stopped: stop signal received
    Running --> Zombie: process finishes
    Zombie --> [*]

تبدأ العملية بحالة Running، وقد تنتقل بشكل متكرر إلى Sleeping أثناء انتظار مورد، وقد تتوقف مؤقتا في حالة Stopped، وعند انتهائها تصبح Zombie مع بقاء سجلها في جدول العمليات.

عرض العمليات باستخدام ps و top

ps (process status) يطبع لقطة من العمليات في لحظة تشغيله. وعلى عكس top، مخرجاته لا تتجدد تلقائيا.

ps

ps بمفرده يسرد فقط العمليات المرتبطة بالطرفية الحالية، بأربعة أعمدة:

العمودالمعنى
PIDرقم العملية
TTYالطرفية المرتبطة بها العملية
TIMEإجمالي وقت المعالج الذي استخدمته العملية حتى الآن
CMDاسم الأمر الذي بدأ العملية

لمعرفة تفاصيل أكثر عن كل عملية، أضف الخيار -u:

ps -u

هذا يضيف عمودي %CPU و %MEM، وعمود STAT يعرض حالة العملية، باستخدام نفس الحروف التي يستخدمها top (موضحة أدناه).

لسرد كل العمليات على النظام بدلا من عمليات الطرفية الحالية فقط، استخدم:

ps -A

ps aux هو صيغة أخرى شائعة الاستخدام لهذا الأمر. يسرد كل العمليات على النظام بنفس صيغة %CPU/%MEM/STAT المفصلة التي يستخدمها ps -u:

ps aux | grep firefox

الـ pipe (|) يمرر جدول العمليات الكامل إلى grep firefox، الذي يحتفظ فقط بالأسطر التي تذكر firefox، وهي طريقة سريعة للعثور على PID برنامج معين دون التمرير عبر الجدول كله.

top يعرض نفس نوع المعلومات التي يعرضها ps aux، لكن بشكل مباشر، ويتجدد كل عدة ثوان:

top

أعمدة top هي:

العمودالمعنى
PIDرقم العملية الفريد
USERاسم المستخدم الذي يملك العملية
PRأولوية الجدولة المعطاة للعملية
NIقيمة الـ niceness للعملية (انظر الأولوية أدناه)
VIRTمقدار الذاكرة الافتراضية المستخدمة
RESمقدار الذاكرة الفعلية المستخدمة
SHRمقدار الذاكرة المشتركة مع عمليات أخرى
Sحالة العملية: R running، S sleeping، D uninterruptible sleep، T traced أو stopped، Z zombie
%CPUنسبة استخدام المعالج
%MEMنسبة استخدام الذاكرة
TIME+إجمالي وقت المعالج المستهلك
COMMANDالأمر الذي بدأ العملية

داخل top، مفاتيح الأسهم تحرك التحديد، q للخروج، و k على عملية محددة تقوم بإنهائها.

الـ Signals وإنهاء العمليات

إرسال signal إلى عملية يحتاج إلى عملية تعمل لفترة كافية لاستقباله. إضافة علامة (&) بعد أمر تجعله يبدأ كـ background process بدلا من foreground process، فيعيد الـ shell موجه الأوامر فورا بدلا من انتظار انتهائه:

sleep 300 &

يطبع الـ shell سطرا مثل [1] 20458. الرقم بعد الـ PID، وهو 20458، هو ما تحتاجه أمثلة kill أدناه؛ الرقم بين الأقواس قبله هو رقم مهمة وغير مطلوب هنا.

kill يرسل signal إلى عملية، وغالبا لطلب إنهائها. إذا لم يحدد اسم signal، يرسل الافتراضي، رقم 15، SIGTERM، الذي يطلب من العملية أن تغلق نفسها بشكل نظيف.

kill 20458

بعض العمليات تتجاهل SIGTERM. في هذه الحالة، SIGKILL (signal رقم 9) ينهي العملية دون شروط، دون إعطائها فرصة لتنظيف نفسها:

kill -9 20458

لرؤية القائمة الكاملة لأسماء وأرقام الـ signals التي يستطيع kill إرسالها، استخدم:

kill -L

kill يحتاج دائما إلى PID. pkill يستهدف العملية بالاسم بدلا من ذلك، وهو مفيد عندما يكون الـ PID غير معروف:

pkill sleep

pkill sleep يطلب من كل عملية باسم sleep أن تنتهي، دون الحاجة إلى الـ PID مسبقا.

أولوية العملية باستخدام nice و renice

يجدول Linux وقت المعالج بين العمليات باستخدام قيمة أولوية تسمى الـ niceness، تتراوح من -20 (الأولوية الأعلى) إلى 19 (الأولوية الأدنى)، مع 0 كقيمة افتراضية. تظهر في عمود NI في top.

لبدء عملية جديدة بقيمة niceness مختارة، استخدم nice:

nice -n 10 sleep 300

هذا يبدأ sleep بقيمة niceness تساوي 10، فيتنازل عن وقت المعالج للعمليات الأهم أثناء عمله. لتغيير niceness عملية تعمل فعلا، استخدم renice مع الـ PID الخاص بها:

renice 10 -p 20458

-p يحدد أن الرقم الذي يليه، 20458، هو PID وليس نوعا آخر من الوسائط. هذا يضبط niceness الـ PID 20458 إلى 10 دون إعادة تشغيلها.

ما معنى DevOps

تقليديا، ينقسم تطوير البرمجيات إلى قسمين. فريق التطوير (development team) يصمم النظام ويخطط له ويبنيه. فريق التشغيل (operations team) يختبر وينشر كل ما ينتجه التطوير، ثم يرسل تقريرا بأي bugs أو إعادة عمل مطلوبة. وبسبب أن هذه الملاحظات غالبا لا تصل إلا بعد أن ينتقل التطوير إلى مشروع آخر، كان مشروع واحد قد يستغرق أسابيع أو شهورا إضافية للإغلاق، مع بقاء فريق التطوير عاطلا في انتظارها. تسمى هذه الفجوة غالبا حائط الحيرة (wall of confusion).

DevOps يجمع الفريقين للعمل بالتعاون بدلا من العمل بالتتابع. رمزه حلقة اللانهاية (infinity loop)، وهي تمثل عملية مستمرة من البناء والاختبار والنشر والتحسين. الجهات التي تتبنى DevOps تتكيف بشكل أسرع مع التغيير وتنتج نشرات (deployments) أكثر اتساقا وسلاسة، مع أن التعاون الأقرب يجلب تحدياته الخاصة في التواصل.

تتم دورة حياة DevOps على مراحل، تدعم كل واحدة منها غالبا أدوات خاصة بها:

  1. Plan: يحدد فريق التطوير الأهداف التي يجب أن يحققها التطبيق.
  2. Code: يعمل المطورون على نفس الـ codebase، ويخزنون الإصدارات في مستودع بأداة مثل Git، التي تتتبع كل تغيير يطرأ على مجموعة من الملفات مع الوقت وتسمح لعدة أشخاص بدمج تغييراتهم معا، ودمج التغييرات عند الحاجة. هذا هو التحكم في الإصدارات (version control).
  3. Build: يتحول الكود إلى شكل قابل للتنفيذ بأدوات مثل Maven و Gradle، التي تؤتمت compile الكود المصدري وتجميعه في حزمة قابلة للتشغيل.
  4. Test: يتم فحص الـ build بحثا عن bugs؛ الأداة الأكثر شهرة لهذا النوع من الاختبار الآلي هي Selenium.
  5. Release and deploy: بعد نجاح الاختبار، ينشر فريق التشغيل التطبيق في بيئة العمل؛ أبرز الأدوات المستخدمة لأتمتة هذه المرحلة هي Ansible و Docker و Kubernetes.
  6. Monitor: يتم رصد المنتج الجاري تشغيله بشكل مستمر؛ Nagios واحدة من أفضل الأدوات المستخدمة لأتمتة هذه المرحلة.
  7. Feedback: ما يكتشفه الرصد يعاد تغذيته إلى مرحلة التخطيط، لتغلق الحلقة.

الخطوة التي تربط الـ build والـ test والـ deployment معا هي continuous integration: أداة مثل Jenkins، التي تبني وتختبر تلقائيا الكود المرفوع حديثا، وترسله ليتم بناؤه واختباره تلقائيا، وتنقله إلى النشر إذا نجح.

flowchart LR
    A["Plan"] --> B["Code (Git)"]
    B --> C["Build (Maven, Gradle)"]
    C --> D["Test (Selenium)"]
    D --> E["Release / Deploy (Ansible, Docker, Kubernetes)"]
    E --> F["Monitor (Nagios)"]
    F -.feedback.-> A
    B -. "sent for build + test, Jenkins" .-> D
    D -. "passes, Jenkins" .-> E

الأسهم المتصلة ترسم الحلقة: التخطيط يغذي الكتابة، الكتابة تغذي البناء، البناء يغذي الاختبار، الاختبار يغذي النشر، النشر يغذي الرصد، والرصد يعيد التغذية إلى التخطيط. الأسهم المنقطة توضح كيف يرسل Jenkins الكود المرفوع حديثا مباشرة إلى خطوة بناء واختبار مجمعة، ثم إلى النشر إذا نجح.

منظمات كبيرة مثل Amazon و Netflix و Walmart و Facebook و Adobe تبنت DevOps. Netflix مثال معروف: بعد إطلاق خدمة البث الخاصة بها في 2007، كانت ساعة واحدة من الـ downtime تقدر بحلول 2014 بتكلفة حوالي 200,000 دولار. ردا على ذلك، بنت الشركة Simian Army، أداة تحدث أعطالا بشكل مستمر داخل بيئتها الخاصة دون التأثير على المستخدمين الحقيقيين؛ هذه الفوضى دفعت المطورين لبناء أنظمة تستمر في العمل حتى عند تعطل أجزاء من البنية التحتية.

صلاحيات المستخدم الفائق والملكية

sudo (superuser do) يشغل أمرا واحدا بصلاحيات root بدلا من صلاحيات المستخدم الحالي. مطلوب للأوامر التي تدير المستخدمين أو المجموعات أو إعدادات النظام العامة.

sudo useradd student1
sudo passwd student1

السطر الأول ينشئ حساب مستخدم باسم student1 بصلاحيات root؛ الثاني يضبط كلمة مروره. نفس النمط يشمل sudo groupadd (إنشاء مجموعة)، و sudo userdel (حذف مستخدم)، و sudo groupdel (حذف مجموعة)، و sudo usermod -g (تغيير المجموعة الأساسية للمستخدم).

chown (change owner) يغير مالك الملف أو الدليل، واختياريا المجموعة الخاصة به.

sudo chown student1:students report.txt

student1:students يضبط المالك إلى student1 والمجموعة إلى students؛ report.txt هو الملف المستهدف. sudo يأتي في المقدمة لأن تغيير مالك ملف عملية تحتاج صلاحيات.

id يطبع الهوية الكامنة وراء حساب المستخدم: رقم المستخدم الرقمي، رقم المجموعة، وكل المجموعات التي ينتمي إليها.

id student1

عند تشغيله بدون أي argument، يطبع id نفس هذه المعلومات للمستخدم الحالي بدلا من ذلك. id -u يطبع فقط رقم المستخدم الرقمي، و id -G يطبع فقط أرقام المجموعات، دون الأسماء:

id -u student1   # -> 1001
id -G student1   # -> 1001 1002 27

البحث في الملفات والنصوص وعرضها

find يتصفح شجرة أدلة بحثا عن ملفات وأدلة تطابق شرطا معينا، ويمكنه تشغيل أمر على كل تطابق يجده.

find . -links 1 -exec ls -l {} \;

. هو نقطة بدء البحث، وهي الدليل الحالي؛ -links 1 يطابق فقط الملفات التي لها link واحد بالضبط؛ -exec ls -l {} \; يشغل ls -l على كل تطابق، حيث {} يمثل مسار الملف المطابق و \; يحدد نهاية الأمر المشغل. -inum 12345 يطابق برقم الـ inode بدلا من عدد الـ links، و -ok يتصرف مثل -exec لكنه يطلب تأكيدا قبل تشغيل الأمر على كل تطابق.

grep يبحث داخل الملفات عن الأسطر التي تطابق نمطا معينا.

grep -n "ERROR" server.log
grep -in "error" server.log

الأمر الأول يبحث في server.log عن ERROR؛ -n يطبع رقم كل سطر مطابق بجانب النص. الأمر الثاني يضيف -i، فيصبح grep يطابق أيضا error بغض النظر عن حالة الأحرف، مع الاستمرار في طباعة أرقام الأسطر لأن -n مدموج معه. grep -c يعد الأسطر المطابقة بدلا من طباعتها، و grep -v يطبع فقط الأسطر التي لا تطابق:

grep -c "ERROR" server.log   # -> 3, a count, not the matching lines themselves
grep -v "ERROR" server.log   # -> every line that does NOT contain ERROR

tail يطبع الجزء الأخير من الملف، وهو مفيد لفحص أحدث أسطر ملف log دون فتحه كاملا.

tail -n 5 server.log

-n 5 يحصر المخرجات في آخر 5 أسطر من server.log؛ بدون -n، يعرض tail افتراضيا آخر 10 أسطر. tail +25 server.log هو صيغة أخرى للأمر، و tail -c 100 server.log يطبع فقط آخر 100 بايت.

ترتيب النصوص وتحويلها

sort يرتب أسطر الملف أبجديا أو رقميا.

sort -n scores.txt

-n يجعل sort يقارن الأسطر كأرقام لا كنصوص، فيسبق 9 الرقم 10 في الترتيب. sort -r يعكس الترتيب، و sort -f يتجاهل حالة الأحرف:

sort -r scores.txt   # -> the same lines, largest first
sort -f names.txt    # -> alphabetical order, treating "ali" and "Ali" as equal

cut يستخرج جزءا من كل سطر في الملف، بناء على موضع الأحرف.

cut -c1-5 codes.txt

-c1-5 يختار الأحرف من 1 إلى 5 في كل سطر، بغض النظر عن قيمة هذه الأحرف. النتيجة عمود واحد يحتوي فقط على هذا الجزء الثابت من كل سطر.

tr (translate) يقرأ من الإدخال القياسي ويستبدل أو يحذف الأحرف، واحدا تلو الآخر.

cat greeting.txt | tr 'a-z' 'A-Z'

cat greeting.txt يطبع الملف، والـ pipe يمرر هذا النص إلى tr، و 'a-z' 'A-Z' يحول كل حرف صغير إلى مقابله الكبير. tr -d يحذف الأحرف المذكورة بدلا من استبدالها، و tr -s يضغط التكرارات إلى تكرار واحد فقط:

echo "aabbccdd" | tr -d 'ab'   # -> ccdd, every a and b removed
echo "aabbccdd" | tr -s 'a-z'  # -> abcd, each run of repeats squeezed to one

sed (stream editor) يحرر النص بشكل غير تفاعلي، ويستخدم غالبا للبحث عن نمط واستبداله.

sed 's/linux/Linux/' notes.txt

's/linux/Linux/' هي تعليمة استبدال: s لـ substitute، linux النمط المطلوب البحث عنه، Linux هو البديل. افتراضيا يطبع sed النص المعدل على الطرفية دون تغيير الملف نفسه.

مقارنة الملفات ونسخ البيانات الخام

diff يقارن ملفين سطرا بسطر ويطبع الأسطر المختلفة.

diff test.txt test1.txt

test.txt و test1.txt هما الملفان اللذان تتم مقارنتهما. الأسطر الموجودة في ملف واحد فقط، أو المختلفة بين الاثنين، تطبع مع علامات توضح من أي ملف جاء كل سطر.

dd هي أداة سطر أوامر تنسخ وتحول البيانات على مستوى وحدات خام لا الملفات، ولهذا يمكن قراءة أو كتابة ملفات الأجهزة (التي تمثل أقراصا أو partitions كاملة) بها كما لو كانت ملفات عادية. وبسبب أنها تعمل مباشرة على أجهزة خام، لا بد من التحقق مرتين من هدفها قبل تشغيلها؛ هدف خاطئ يمكن أن يمحو بيانات لم يكن مقصودا لمسها.

dd if=/dev/zero of=testfile bs=1M count=10

if= يحدد الإدخال، وهنا /dev/zero، وهو جهاز خاص يولد سيلا لا نهائيا من bytes صفرية؛ of= يحدد المخرج، وهو ملف عادي في هذه الحالة؛ bs=1M يضبط حجم الوحدة إلى ميجابايت واحد؛ count=10 ينسخ 10 من هذه الوحدات، فتكون النتيجة ملفا بحجم 10 ميجابايت مليئا بالأصفار. الكتابة إلى ملف عادي بهذه الطريقة أمر آمن للتدريب عليه؛ الحالة التي تحتاج إلى التحقق المزدوج هي توجيه of= إلى ملف جهاز مثل /dev/sda بدلا من ذلك، الأمر الذي يمحو البيانات الخام لهذا الجهاز.

tar و gzip يبقيان مفيدين لتجميع الملفات قبل نقلها أو أخذ نسخة احتياطية منها: tar czf archive.tar.gz project/ يجمع ويضغط دليل مشروع في خطوة واحدة، و tar xzf archive.tar.gz يعكس العملية. c ينشئ archive جديدا، و z يمرره عبر ضغط gzip، و f يحدد اسم ملف الـ archive؛ x يستخرج بدلا من الإنشاء، فيعكس العملية.

معلومات النظام والشبكة

df (disk free) يبين مقدار المساحة المستخدمة والمتاحة على كل filesystem مركب، و du (disk usage) يبين مقدار المساحة التي يشغلها دليل معين.

df -h
du -hs ~

-h يطبع الأحجام بوحدات مقروءة للإنسان (KB، MB، GB) بدلا من bytes خام؛ -s في du يطبع إجمالي واحد للدليل المستهدف بدلا من سطر لكل ملف بداخله.

free يبين مقدار مساحة الـ RAM والـ swap المستخدمة.

free -h

يحتوي المخرج على سطر واحد للذاكرة الفعلية (Mem) وسطر للـ swap (Swap)، كل واحد منهما مقسم إلى أعمدة total و used و free، مرة أخرى بوحدات مقروءة للإنسان.

ifconfig (interface configuration) يعرض أو يهيئ واجهات الشبكة الخاصة بالجهاز.

ifconfig -a

-a يعرض كل الواجهات، بما فيها التي متوقفة (down) حاليا.

ping يرسل packets إلى host ويبين إذا كان يستجيب وبأي سرعة، وهذا ما يجعله الفحص الأول المعتاد للتأكد من اتصال الشبكة.

ping -c 4 google.com

-c 4 يحصر ping في 4 packets بالضبط قبل أن يتوقف من نفسه؛ بدون -c يستمر في الإرسال حتى يقاطع بـ Ctrl+C.

telnet يتصل بجهاز Linux بعيد لتشغيل برامج وتنفيذ عمليات إدارة عن بعد عليه. تحديد port بعد اسم الـ host يفحص إذا كانت خدمة معينة هناك متاحة.

telnet google.com 80

google.com هو الـ host الذي يتم الاتصال به و 80 هو الـ port، وهو الذي تستمع عليه خوادم الويب؛ اتصال ناجح يطبع Connected to google.com. و Escape character is '^]'.، مؤكدا أن الخدمة استجابت. telnet localhost يستهدف بدلا من ذلك الجهاز المحلي على port الـ telnet الافتراضي، لكنه ينجح فقط إذا كان خادم telnet مثبتا وشغالا هناك؛ في إعداد Linux أو VM أو WSL نموذجي لا يستمع أي شيء على هذا الـ port، فتفشل المحاولة فورا بـ Connection refused بدلا من فتح جلسة. قاطع جلسة مفتوحة بـ Ctrl+C للعودة إلى موجه الأوامر.

hostname يطبع الاسم الذي يعرف به الجهاز على الشبكة.

hostname

أخيرا، history يسرد الأوامر التي كتبت سابقا في جلسة الـ shell الحالية، كل واحد منها مرقم.

history 10

history 10 يحصر السرد في آخر 10 أوامر، وهذا مفيد لاستدعاء سريع لأمر كتب سابقا في الجلسة.

مهام المعمل

المهمة 1: استكشاف العمليات الجارية

  1. افتح طرفية وشغل ps. المخرج المتوقع: جدول قصير بأعمدة PID و TTY و TIME و CMD، محصور في الـ shell نفسه وهذا الأمر.

  2. شغل ps -u. المخرج المتوقع: نفس نوع السرد، مع أعمدة %CPU و %MEM و STAT الآن.

  3. شغل ps -A. المخرج المتوقع: قائمة أطول بكثير، تشمل عمليات النظام التي لم يظهرها ps بمفرده.

  4. شغل ps aux | grep bash. المخرج المتوقع: سطر واحد أو أكثر يحتوي عمود COMMAND فيه على bash، كل سطر يعرض PID تلك العملية و %CPU و %MEM الخاصين بها.

  5. شغل top. المخرج المتوقع: جدول يتجدد باستمرار مرتب بحسب استخدام المعالج. اضغط q للخروج من top والعودة إلى موجه الأوامر.

المهمة 2: الـ Signals والإنهاء والأولوية

  1. شغل sleep 600 &. المخرج المتوقع: سطر مثل [1] 20777، حيث 20777 هو الـ PID المستخدم في الخطوات التالية.

  2. شغل kill -L. المخرج المتوقع: قائمة مرقمة بأسماء signals، تشمل 9) SIGKILL و 15) SIGTERM.

  3. شغل kill <PID الخاص بها>. المخرج المتوقع: لا مخرج من kill نفسه.

  4. شغل ps aux | grep sleep. المخرج المتوقع: عملية sleep 600 من الخطوة 1 لا تظهر بعد الآن؛ يظهر فقط أمر grep نفسه، مطابقا نمط بحثه الخاص.

  5. شغل sleep 600 & مرة أخرى، ثم kill -9 <PID الخاص بها>. المخرج المتوقع: تنتهي العملية فورا، دون التنظيف الذي يسمح به kill العادي.

  6. شغل sleep 500 & مرتين، ثم pkill sleep. المخرج المتوقع: تنتهي العمليتان في الخلفية؛ ps aux | grep sleep بعد ذلك لا يسرد عملية sleep 500 بعد الآن، فقط أمر grep نفسه مطابقا نمطه الخاص.

  7. شغل nice -n 10 sleep 400 &، ثم top. المخرج المتوقع: تظهر عملية sleep 400 وعمود NI الخاص بها مضبوط مسبقا على 10 بدلا من القيمة الافتراضية 0.

  8. شغل sleep 400 & دون بادئة nice، ثم شغل top للتأكد أن عمود NI الخاص بها يقرأ 0، وهي الـ niceness الافتراضية. سجل الـ PID الخاص بها، وفي طرفية أخرى شغل renice 10 -p <PID>. المخرج المتوقع: يطبع renice الأولوية القديمة والجديدة، 0 و 10، ويتغير NI في top إلى 10.

المهمة 3: أوامر DevOps لمعالجة النصوص

  1. أنشئ ملفا نموذجيا صغيرا:

    printf "3,Ali,90\n1,Sara,75\n2,Omar,60\n" > students.csv
  2. شغل tail -n 2 students.csv. المخرج المتوقع: آخر سطرين من الملف، 1,Sara,75 ثم 2,Omar,60.

  3. شغل sort -n students.csv. المخرج المتوقع: الأسطر الثلاثة مرتبة من جديد بحسب الحقل الأول: 1,Sara,75، ثم 2,Omar,60، ثم 3,Ali,90.

  4. أنشئ ملفا نموذجيا بعرض ثابت واستخرج بحسب موضع الأحرف:

    printf "12345ABCDE\n67890FGHIJ\n" > codes.txt
    cut -c1-5 codes.txt

    المخرج المتوقع: 12345 ثم 67890، أول خمسة أحرف من كل سطر.

  5. شغل grep -n "Omar" students.csv. المخرج المتوقع: 3:2,Omar,60.

  6. شغل grep -in "sara" students.csv. المخرج المتوقع: 2:1,Sara,75، تمت المطابقة مع أن مصطلح البحث كان بأحرف صغيرة والملف يحتوي Sara بحرف كبير.

  7. شغل sed 's/Omar/Omar Khaled/' students.csv > students_updated.csv، ثم diff students.csv students_updated.csv. المخرج المتوقع:

    3c3
    < 2,Omar,60
    ---
    > 2,Omar Khaled,60
  8. شغل cat students.csv | tr 'a-z' 'A-Z'. المخرج المتوقع:

    3,ALI,90
    1,SARA,75
    2,OMAR,60
  9. شغل dd if=/dev/zero of=testfile bs=1M count=10، ثم ls -lh testfile. المخرج المتوقع: يطبع dd ملخصا مثل 10+0 records in، 10+0 records out، و 10485760 bytes (10 MB) copied، ويظهر ls -lh testfile ملفا بحجم 10M. احذفه بعد ذلك بـ rm testfile، لأنه أنشئ فقط للتدريب.

المهمة 4: النظام والملكية ومعلومات الشبكة

  1. شغل df -h ثم du -hs ~. المخرج المتوقع: جدول filesystem من df، وحجم واحد مثل 2.3G لدليلك الرئيسي من du.

  2. شغل free -h. المخرج المتوقع: سطران، Mem و Swap، كل واحد منهما يعرض total و used و free بوحدات مقروءة للإنسان.

  3. شغل hostname ثم ifconfig -a. المخرج المتوقع: اسم الجهاز، متبوعا بكتلة لكل واجهة شبكة تعرض عنوان IP الخاص بها وحالتها.

  4. شغل ping -c 4 google.com. المخرج المتوقع: أربعة أسطر رد، كل واحد يبين round-trip time، متبوعة بملخص يبين نسبة فقد packets صفر بالمئة (إذا كان الاتصال متاحا).

  5. شغل telnet google.com 80. المخرج المتوقع: Trying <عنوان IP>... متبوعا بـ Connected to google.com. و Escape character is '^]'.، مؤكدا نجاح الاتصال. قاطعه بـ Ctrl+C للعودة إلى موجه الأوامر.

  6. شغل sudo chown student1 students.csv (عدل اسم المستخدم إلى اسم موجود فعلا على نظامك)، ثم ls -l students.csv، ثم id student1. المخرج المتوقع: عمود المالك في ls -l يظهر الآن student1، و id student1 يطبع رقم المستخدم الرقمي ورقم المجموعة وعضويات المجموعات الخاصة بهذا الحساب.

  7. شغل tar czf lab10_backup.tar.gz students.csv students_updated.csv codes.txt ثم history 10. المخرج المتوقع: ملف جديد lab10_backup.tar.gz في الدليل الحالي، وقائمة مرقمة بآخر 10 أوامر؛ تأكد أن أمر tar czf ... الذي شغلته الآن يظهر كواحد من الأسطر العشرة المسرودة.

الملخص

  • العملية هي نسخة قيد التشغيل من برنامج، يعرفها PID، وتتنقل بين حالات running و sleeping و stopped و zombie خلال دورة حياتها.
  • ps و ps -u و ps -A و ps aux يعرض كل منها شريحة مختلفة من جدول العمليات كلقطة، بينما يعرض top نفس نوع المعلومات بشكل مباشر.
  • إضافة & بعد أمر تشغله في الخلفية بدلا من المقدمة، فتحرر الطرفية؛ kill بعدها يرسل signal إلى PID تلك العملية، ويكون الافتراضي SIGTERM، و kill -9 يفرض الإنهاء بـ SIGKILL، و kill -L يسرد كل الـ signals المتاحة، و pkill يستهدف العملية بالاسم بدلا من الـ PID.
  • nice يبدأ عملية بقيمة niceness مختارة من -20 إلى 19، و renice يغير niceness عملية تعمل فعلا.
  • DevOps نشأ من التأخير الناتج عن فصل التطوير عن التشغيل؛ يوحد التخطيط والكتابة والبناء والاختبار والنشر والرصد في حلقة واحدة مستمرة، بأدوات مثل Jenkins التي تنقل الكود تلقائيا من commit إلى deployment.
  • مجموعة أوامر DevOps تشمل الصلاحيات والهوية (sudo، chown، id)، والبحث والعرض (find، grep -n، grep -i، tail)، وتحويل النصوص (sort، cut، tr، sed)، والمقارنة والنسخ الخام (diff، dd)، والأرشفة (tar، gzip)، وحالة النظام والشبكة (df، du، free، ifconfig، ping، telnet، hostname، history).