أوامر Linux - الجزء الثاني: العمليات وأوامر 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، مخرجاته لا تتجدد تلقائيا.
psps بمفرده يسرد فقط العمليات المرتبطة بالطرفية الحالية، بأربعة أعمدة:
| العمود | المعنى |
|---|---|
| PID | رقم العملية |
| TTY | الطرفية المرتبطة بها العملية |
| TIME | إجمالي وقت المعالج الذي استخدمته العملية حتى الآن |
| CMD | اسم الأمر الذي بدأ العملية |
لمعرفة تفاصيل أكثر عن كل عملية، أضف الخيار -u:
ps -uهذا يضيف عمودي %CPU و %MEM، وعمود STAT يعرض حالة العملية، باستخدام نفس الحروف التي يستخدمها top (موضحة أدناه).
لسرد كل العمليات على النظام بدلا من عمليات الطرفية الحالية فقط، استخدم:
ps -Aps 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 -Lkill يحتاج دائما إلى PID. pkill يستهدف العملية بالاسم بدلا من ذلك، وهو مفيد عندما يكون الـ PID غير معروف:
pkill sleeppkill 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 على مراحل، تدعم كل واحدة منها غالبا أدوات خاصة بها:
- Plan: يحدد فريق التطوير الأهداف التي يجب أن يحققها التطبيق.
- Code: يعمل المطورون على نفس الـ codebase، ويخزنون الإصدارات في مستودع بأداة مثل Git، التي تتتبع كل تغيير يطرأ على مجموعة من الملفات مع الوقت وتسمح لعدة أشخاص بدمج تغييراتهم معا، ودمج التغييرات عند الحاجة. هذا هو التحكم في الإصدارات (version control).
- Build: يتحول الكود إلى شكل قابل للتنفيذ بأدوات مثل Maven و Gradle، التي تؤتمت compile الكود المصدري وتجميعه في حزمة قابلة للتشغيل.
- Test: يتم فحص الـ build بحثا عن bugs؛ الأداة الأكثر شهرة لهذا النوع من الاختبار الآلي هي Selenium.
- Release and deploy: بعد نجاح الاختبار، ينشر فريق التشغيل التطبيق في بيئة العمل؛ أبرز الأدوات المستخدمة لأتمتة هذه المرحلة هي Ansible و Docker و Kubernetes.
- Monitor: يتم رصد المنتج الجاري تشغيله بشكل مستمر؛ Nagios واحدة من أفضل الأدوات المستخدمة لأتمتة هذه المرحلة.
- 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.txtstudent1: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 ERRORtail يطبع الجزء الأخير من الملف، وهو مفيد لفحص أحدث أسطر ملف 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 equalcut يستخرج جزءا من كل سطر في الملف، بناء على موضع الأحرف.
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 onesed (stream editor) يحرر النص بشكل غير تفاعلي، ويستخدم غالبا للبحث عن نمط واستبداله.
sed 's/linux/Linux/' notes.txt's/linux/Linux/' هي تعليمة استبدال: s لـ substitute، linux النمط المطلوب البحث عنه، Linux هو البديل. افتراضيا يطبع sed النص المعدل على الطرفية دون تغيير الملف نفسه.
مقارنة الملفات ونسخ البيانات الخام
diff يقارن ملفين سطرا بسطر ويطبع الأسطر المختلفة.
diff test.txt test1.txttest.txt و test1.txt هما الملفان اللذان تتم مقارنتهما. الأسطر الموجودة في ملف واحد فقط، أو المختلفة بين الاثنين، تطبع مع علامات توضح من أي ملف جاء كل سطر.
dd هي أداة سطر أوامر تنسخ وتحول البيانات على مستوى وحدات خام لا الملفات، ولهذا يمكن قراءة أو كتابة ملفات الأجهزة (التي تمثل أقراصا أو partitions كاملة) بها كما لو كانت ملفات عادية. وبسبب أنها تعمل مباشرة على أجهزة خام، لا بد من التحقق مرتين من هدفها قبل تشغيلها؛ هدف خاطئ يمكن أن يمحو بيانات لم يكن مقصودا لمسها.
dd if=/dev/zero of=testfile bs=1M count=10if= يحدد الإدخال، وهنا /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 80google.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 10history 10 يحصر السرد في آخر 10 أوامر، وهذا مفيد لاستدعاء سريع لأمر كتب سابقا في الجلسة.
مهام المعمل
المهمة 1: استكشاف العمليات الجارية
-
افتح طرفية وشغل
ps. المخرج المتوقع: جدول قصير بأعمدةPIDوTTYوTIMEوCMD، محصور في الـ shell نفسه وهذا الأمر. -
شغل
ps -u. المخرج المتوقع: نفس نوع السرد، مع أعمدة%CPUو%MEMوSTATالآن. -
شغل
ps -A. المخرج المتوقع: قائمة أطول بكثير، تشمل عمليات النظام التي لم يظهرهاpsبمفرده. -
شغل
ps aux | grep bash. المخرج المتوقع: سطر واحد أو أكثر يحتوي عمودCOMMANDفيه علىbash، كل سطر يعرض PID تلك العملية و%CPUو%MEMالخاصين بها. -
شغل
top. المخرج المتوقع: جدول يتجدد باستمرار مرتب بحسب استخدام المعالج. اضغطqللخروج منtopوالعودة إلى موجه الأوامر.
المهمة 2: الـ Signals والإنهاء والأولوية
-
شغل
sleep 600 &. المخرج المتوقع: سطر مثل[1] 20777، حيث20777هو الـ PID المستخدم في الخطوات التالية. -
شغل
kill -L. المخرج المتوقع: قائمة مرقمة بأسماء signals، تشمل9) SIGKILLو15) SIGTERM. -
شغل
kill <PID الخاص بها>. المخرج المتوقع: لا مخرج منkillنفسه. -
شغل
ps aux | grep sleep. المخرج المتوقع: عمليةsleep 600من الخطوة 1 لا تظهر بعد الآن؛ يظهر فقط أمرgrepنفسه، مطابقا نمط بحثه الخاص. -
شغل
sleep 600 &مرة أخرى، ثمkill -9 <PID الخاص بها>. المخرج المتوقع: تنتهي العملية فورا، دون التنظيف الذي يسمح بهkillالعادي. -
شغل
sleep 500 &مرتين، ثمpkill sleep. المخرج المتوقع: تنتهي العمليتان في الخلفية؛ps aux | grep sleepبعد ذلك لا يسرد عمليةsleep 500بعد الآن، فقط أمرgrepنفسه مطابقا نمطه الخاص. -
شغل
nice -n 10 sleep 400 &، ثمtop. المخرج المتوقع: تظهر عمليةsleep 400وعمودNIالخاص بها مضبوط مسبقا على10بدلا من القيمة الافتراضية0. -
شغل
sleep 400 &دون بادئةnice، ثم شغلtopللتأكد أن عمودNIالخاص بها يقرأ0، وهي الـ niceness الافتراضية. سجل الـ PID الخاص بها، وفي طرفية أخرى شغلrenice 10 -p <PID>. المخرج المتوقع: يطبعreniceالأولوية القديمة والجديدة،0و10، ويتغيرNIفيtopإلى10.
المهمة 3: أوامر DevOps لمعالجة النصوص
-
أنشئ ملفا نموذجيا صغيرا:
printf "3,Ali,90\n1,Sara,75\n2,Omar,60\n" > students.csv -
شغل
tail -n 2 students.csv. المخرج المتوقع: آخر سطرين من الملف،1,Sara,75ثم2,Omar,60. -
شغل
sort -n students.csv. المخرج المتوقع: الأسطر الثلاثة مرتبة من جديد بحسب الحقل الأول:1,Sara,75، ثم2,Omar,60، ثم3,Ali,90. -
أنشئ ملفا نموذجيا بعرض ثابت واستخرج بحسب موضع الأحرف:
printf "12345ABCDE\n67890FGHIJ\n" > codes.txt cut -c1-5 codes.txtالمخرج المتوقع:
12345ثم67890، أول خمسة أحرف من كل سطر. -
شغل
grep -n "Omar" students.csv. المخرج المتوقع:3:2,Omar,60. -
شغل
grep -in "sara" students.csv. المخرج المتوقع:2:1,Sara,75، تمت المطابقة مع أن مصطلح البحث كان بأحرف صغيرة والملف يحتويSaraبحرف كبير. -
شغل
sed 's/Omar/Omar Khaled/' students.csv > students_updated.csv، ثمdiff students.csv students_updated.csv. المخرج المتوقع:3c3 < 2,Omar,60 --- > 2,Omar Khaled,60 -
شغل
cat students.csv | tr 'a-z' 'A-Z'. المخرج المتوقع:3,ALI,90 1,SARA,75 2,OMAR,60 -
شغل
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: النظام والملكية ومعلومات الشبكة
-
شغل
df -hثمdu -hs ~. المخرج المتوقع: جدول filesystem منdf، وحجم واحد مثل2.3Gلدليلك الرئيسي منdu. -
شغل
free -h. المخرج المتوقع: سطران،MemوSwap، كل واحد منهما يعرضtotalوusedوfreeبوحدات مقروءة للإنسان. -
شغل
hostnameثمifconfig -a. المخرج المتوقع: اسم الجهاز، متبوعا بكتلة لكل واجهة شبكة تعرض عنوان IP الخاص بها وحالتها. -
شغل
ping -c 4 google.com. المخرج المتوقع: أربعة أسطر رد، كل واحد يبين round-trip time، متبوعة بملخص يبين نسبة فقد packets صفر بالمئة (إذا كان الاتصال متاحا). -
شغل
telnet google.com 80. المخرج المتوقع:Trying <عنوان IP>...متبوعا بـConnected to google.com.وEscape character is '^]'.، مؤكدا نجاح الاتصال. قاطعه بـCtrl+Cللعودة إلى موجه الأوامر. -
شغل
sudo chown student1 students.csv(عدل اسم المستخدم إلى اسم موجود فعلا على نظامك)، ثمls -l students.csv، ثمid student1. المخرج المتوقع: عمود المالك فيls -lيظهر الآنstudent1، وid student1يطبع رقم المستخدم الرقمي ورقم المجموعة وعضويات المجموعات الخاصة بهذا الحساب. -
شغل
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).