كيفية تشغيل العمليات الخلفية والتحكم فيها على Linux

استخدم غلاف Bash في Linux لإدارة العمليات الأمامية والخلفية. يمكنك استخدام وظائف التحكم في الوظائف والإشارات في Bash لمنحك مزيدًا من المرونة في كيفية تشغيل الأوامر. سنوضح لك كيفية القيام بذلك.




كل شيء عن العمليات

عندما يتم تنفيذ برنامج في نظام تشغيل Linux أو نظام تشغيل شبيه بنظام Unix، يتم بدء عملية. “العملية” هو الاسم الذي يطلق على التمثيل الداخلي للبرنامج المنفذ في ذاكرة الكمبيوتر. هناك عملية لكل برنامج نشط. في الواقع، هناك عملية لكل شيء تقريبًا يعمل على الكمبيوتر. وهذا يشمل مكونات نظام التشغيل لديك. بيئة سطح مكتب رسومية (GDE) مثل جنوم أو كيدي، والنظام الشياطين التي يتم إطلاقها عند بدء التشغيل.

لماذا يتم تشغيل كل شيء تقريبًا؟ حسنًا، يتم تشغيل عناصر Bash المضمنة مثل قرص مضغوط, كلمة مرور، و الاسم المستعار لا تحتاج إلى تشغيل عملية (أو “إنتاجها”) عند تشغيلها. ينفذ Bash هذه الأوامر داخل مثيل غلاف Bash الذي يعمل في نافذة المحطة الطرفية الخاصة بك. هذه الأوامر سريعة على وجه التحديد لأنها لا تحتاج إلى تشغيل عملية حتى يتم تنفيذها. (يمكنك كتابة help في نافذة المحطة الطرفية لرؤية قائمة المضمنات في Bash.)


يمكن أن تعمل العمليات في المقدمة، وفي هذه الحالة تسيطر على محطتك حتى تكتمل، أو يمكن تشغيلها في الخلفية. لا تهيمن العمليات التي تعمل في الخلفية على نافذة المحطة ويمكنك الاستمرار في العمل فيها. أو على الأقل، لا تهيمن على نافذة المحطة إذا لم تولد إخراجًا على الشاشة.

مثال فوضوي

سنبدأ بـ ping بسيط تتبع الجريسنقوم بإرسال أمر ping إلى نطاق How-To Geek. سيتم تنفيذ هذا الأمر كعملية أمامية.

ping www.howtogeek.com

ping www.howtogeek.com في نافذة المحطة الطرفية

نحصل على النتائج المتوقعة، بالتمرير لأسفل نافذة المحطة الطرفية. لا يمكننا القيام بأي شيء آخر في نافذة المحطة الطرفية أثناء تشغيل الأمر ping. لإنهاء الأمر، اضغط على Ctrl+C.


Ctrl+C

إخراج تتبع ping في نافذة المحطة الطرفية

يتم تسليط الضوء على التأثير المرئي لـ Ctrl+C في لقطة الشاشة. يقدم ping ملخصًا قصيرًا ثم يتوقف.

لنكرر ذلك. ولكن هذه المرة سنضغط على Ctrl+Z بدلاً من Ctrl+C. لن يتم إنهاء المهمة. بل ستصبح مهمة خلفية. وسنستعيد التحكم في نافذة المحطة الطرفية.

ping www.howtogeek.com

Ctrl+Z

تأثير Ctrl+Z على أمر يتم تشغيله في نافذة المحطة الطرفية

يتم تسليط الضوء على التأثير المرئي للضغط على Ctrl+Z في لقطة الشاشة.


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

أمر الوظائف سيتم إدراج الوظائف التي تم البدء فيها في جلسة المحطة الطرفية الحالية. ولأن الوظائف هي عمليات (حتمًا)، فيمكننا أيضًا استخدام الأمر ps لرؤيتها. دعنا نستخدم كلا الأمرين ونقارن مخرجاتهما. سنستخدم خيار T (المحطة الطرفية) لإدراج العمليات التي تعمل في نافذة المحطة الطرفية هذه فقط. لاحظ أنه ليست هناك حاجة لاستخدام شرطة – مع خيار T.

jobs

ps T

أمر الوظائف في نافذة المحطة الطرفية


يخبرنا أمر الوظائف بما يلي:

  • (1): الرقم الموجود بين قوسين هو رقم المهمة. يمكننا استخدام هذا للإشارة إلى المهمة عندما نحتاج إلى التحكم فيها باستخدام أوامر التحكم في المهمة.
  • +: تشير علامة الجمع + إلى أن هذه هي المهمة التي سيتم التصرف فيها إذا استخدمنا أمر التحكم في المهمة بدون رقم مهمة محدد. تسمى المهمة الافتراضية. المهمة الافتراضية هي دائمًا المهمة التي تمت إضافتها مؤخرًا إلى قائمة المهام.
  • متوقف: العملية ليست قيد التشغيل.
  • ping www.howtogeek.com: سطر الأوامر الذي بدأ العملية.

يخبرنا الأمر ps بما يلي:

  • PID: معرف العملية. كل عملية لها معرف فريد.
  • TTY: شبه الطابعة (نافذة المحطة الطرفية) التي تم تنفيذ العملية من خلالها.
  • STAT: حالة العملية.
  • الوقت: مقدار وقت وحدة المعالجة المركزية الذي تستهلكه العملية.
  • الأمر: الأمر الذي بدأ العملية.

هذه هي القيم المشتركة لعمود STAT:


  • د: النوم غير المنقطع. تكون العملية في حالة انتظار، عادة في انتظار الإدخال أو الإخراج، ولا يمكن مقاطعتها.
  • أنا: عاطل.
  • ر: الجري.
  • س: النوم المتقطع.
  • ت: تم التوقف بسبب إشارة التحكم في الوظيفة.
  • Z: عملية زومبي. تم إنهاء العملية ولكن لم يتم “تنظيفها” بواسطة عمليتها الأصلية.

يمكن متابعة القيمة الموجودة في عمود STAT بواسطة أحد المؤشرات الإضافية التالية:

  • <: مهمة ذات أولوية عالية (ليست لطيفة بالنسبة للعمليات الأخرى).
  • ن: أولوية منخفضة (لطيفة بالنسبة للعمليات الأخرى).
  • L: عملية تحتوي على صفحات مقفلة في الذاكرة (تستخدم عادةً بواسطة العمليات في الوقت الفعلي).
  • س: قائد الجلسة. قائد الجلسة هو عملية أطلقت مجموعات العمليات. الغلاف هو قائد الجلسة.
  • ل: عملية متعددة الخيوط.
  • +: عملية المقدمة.

يمكننا أن نرى أن Bash لديه حالة Ss. يشير الحرف الكبير “S” إلى أن غلاف Bash في وضع السكون، ويمكن مقاطعته. بمجرد أن نحتاج إليه، سيستجيب. يشير الحرف الصغير “s” إلى أن الغلاف هو قائد الجلسة.


الأمر ping له حالة T. وهذا يخبرنا بأن الأمر ping قد توقف بواسطة إشارة التحكم في الوظيفة. في هذا المثال، كان هذا هو Ctrl+Z الذي استخدمناه لوضعه في الخلفية.

الأمر ps T له حالة R، والتي تعني التشغيل. يشير الرمز + إلى أن هذه العملية عضو في مجموعة المقدمة. لذا فإن الأمر ps T يعمل في المقدمة.

الأمر bg

يستخدم الأمر bg لاستئناف عملية خلفية. ويمكن استخدامه مع أو بدون رقم مهمة. إذا استخدمته بدون رقم مهمة، يتم إحضار المهمة الافتراضية إلى المقدمة. لا تزال العملية تعمل في الخلفية. لا يمكنك إرسال أي إدخال إليها.

إذا أصدرنا الأمر bg، فسوف نستأنف أمر ping الخاص بنا:

bg

bg في نافذة المحطة الطرفية


يتم استئناف أمر ping ونرى إخراج التمرير في نافذة المحطة الطرفية مرة أخرى. يتم عرض اسم الأمر الذي تم إعادة تشغيله لك. يتم تسليط الضوء على ذلك في لقطة الشاشة.

تم استئناف عملية ping في الخلفية مع إخراج في أرملة المحطة الطرفية

لكن لدينا مشكلة. المهمة تعمل في الخلفية ولا تقبل الإدخال. إذن كيف يمكننا إيقافها؟ لا تفعل Ctrl+C أي شيء. يمكننا رؤية ذلك عندما نكتبه، لكن المهمة في الخلفية لا تتلقى تلك الضغطات على المفاتيح، لذا تظل تعمل بشكل مبهج.

مهمة الخلفية تتجاهل Ctrl+C في نافذة المحطة الطرفية


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

لإيقاف مهمة الخلفية، نحتاج إلى إحضارها إلى المقدمة ثم إيقافها.

الأمر fg

سيعمل الأمر fg على جلب مهمة خلفية إلى المقدمة. ومثله كمثل الأمر bg، يمكن استخدامه مع أو بدون رقم مهمة. واستخدامه مع رقم مهمة يعني أنه سيعمل على مهمة معينة. وإذا تم استخدامه بدون رقم مهمة، فسيتم استخدام آخر أمر تم إرساله إلى الخلفية.

إذا كتبنا fg، فسيتم إحضار أمر ping إلى المقدمة. يتم خلط الأحرف التي نكتبها مع الناتج من أمر ping، ولكن يتم تشغيلها بواسطة shell كما لو تم إدخالها على سطر الأوامر كالمعتاد. وفي الواقع، من وجهة نظر shell Bash، هذا هو بالضبط ما حدث.


fg

تم دمج الأمر fg مع الناتج من ping في نافذة المحطة الطرفية

والآن بعد أن أصبح الأمر ping يعمل في المقدمة مرة أخرى، يمكننا استخدام Ctrl+C لإنهائه.

Ctrl+C

Ctrl+C يوقف أمر ping في نافذة المحطة الطرفية

نحن بحاجة إلى إرسال الإشارات الصحيحة

لم يكن ذلك جميلاً على الإطلاق. من الواضح أن تشغيل عملية في الخلفية يعمل بشكل أفضل عندما لا تنتج العملية أي مخرجات ولا تتطلب إدخالاً.

ولكن، سواء كان مثالنا فوضويًا أم لا، فقد حقق ما يلي:

  • وضع العملية في الخلفية.
  • استعادة العملية إلى حالة التشغيل في الخلفية.
  • إرجاع العملية إلى المقدمة.
  • إنهاء العملية.


عندما تستخدم Ctrl+C وCtrl+Z، فأنت ترسل إشارات إلى العملية. وهذه هي طرق الاختزال من استخدام أمر القتل. هناك 64 اشارات مختلفة يمكن أن ترسل هذه الأوامر أمر kill. استخدم kill -l في سطر الأوامر لإدراجها. الأمر kill ليس المصدر الوحيد لهذه الإشارات. يتم رفع بعضها تلقائيًا بواسطة عمليات أخرى داخل النظام

وفيما يلي بعض منها المستخدمة بشكل شائع.

  • SIGHUP: إشارة 1. يتم إرسالها تلقائيًا إلى العملية عندما يكون الجهاز الطرفي الذي تعمل فيه مغلقًا.
  • SIGINT: إشارة 2. يتم إرسالها إلى عملية تضغط على Ctrl+C. تتم مقاطعة العملية وإخبارها بإنهائها.
  • SIGQUIT: إشارة 3. يتم إرسالها إلى العملية إذا أرسل المستخدم إشارة إنهاء Ctrl+D.
  • SIGKILL: الإشارة 9. يتم إيقاف العملية على الفور ولن تحاول إغلاقها بشكل نظيف. لا يتم إغلاق العملية بشكل سليم.
  • SIGTERM: الإشارة 15. هذه هي الإشارة الافتراضية التي يتم إرسالها بواسطة kill. وهي إشارة إنهاء البرنامج القياسية.
  • SIGTSTP: الإشارة 20. يتم إرسالها إلى عملية ما عند استخدام Ctrl+Z. يتم إيقاف العملية ووضعها في الخلفية.


يتعين علينا استخدام أمر kill لإصدار الإشارات التي لا تحتوي على مجموعات مفاتيح مخصصة لها.

مزيد من التحكم في الوظائف

يتم وضع العملية التي تم نقلها إلى الخلفية باستخدام Ctrl+Z في حالة الإيقاف. يتعين علينا استخدام الأمر bg لبدء تشغيلها مرة أخرى. إن تشغيل برنامج كعملية خلفية قيد التشغيل أمر بسيط. أضف علامة & إلى نهاية سطر الأوامر.

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

بينما يكون صحيحًا؛ قم بتكرار “عملية حلقة How-To Geek”؛ وضع السكون 3؛ تم ذلك

بينما صحيح؛ قم بالصدى "كيفية عمل حلقة جيك لوب"; وضع السكون 3؛ تم ذلك & في نافذة المحطة الطرفية


يتم إخبارنا برقم المهمة ومعرف العملية. رقم المهمة لدينا هو 1 ومعرف العملية هو 1979. يمكننا استخدام هذه المعرفات للتحكم في العملية.

يبدأ الناتج من الحلقة اللانهائية لدينا في الظهور في نافذة المحطة الطرفية. وكما كان الحال من قبل، يمكننا استخدام سطر الأوامر ولكن أي أوامر نصدرها تتخللها الناتج من عملية الحلقة.

ل س

مخرجات عملية الحلقة الخلفية المتخللة بمخرجات الأوامر الأخرى

لإيقاف عمليتنا، يمكننا استخدام الوظائف لتذكير أنفسنا برقم الوظيفة، ثم استخدام القتل.

تشير تقارير الوظائف إلى أن عمليتنا هي الوظيفة رقم 1. لاستخدام هذا الرقم مع kill، يجب أن نسبقه بعلامة النسبة المئوية %.

jobs

kill %1


الوظائف وقتل %1 في نافذة المحطة الطرفية

يرسل الأمر kill إشارة SIGTERM، رقم الإشارة 15، إلى العملية ويتم إنهاؤها. عند الضغط على مفتاح Enter بعد ذلك، يتم عرض حالة المهمة. يتم إدراج العملية على أنها “منتهية”. إذا لم تستجب العملية لأمر kill، يمكنك رفعها إلى مستوى أعلى. استخدم kill مع SIGKILL، رقم الإشارة 9. ما عليك سوى وضع الرقم 9 بين أمر kill ورقم المهمة.

kill 9 %1

الأشياء التي قمنا بتغطيتها

  • Ctrl+C: يرسل SIGINT، الإشارة 2، إلى العملية – إذا كانت تقبل الإدخال – ويطلب منها إنهاء العملية.
  • Ctrl+D: يرسل SISQUIT، الإشارة 3، إلى العملية – إذا كانت تقبل الإدخال – ويطلب منها الخروج.
  • Ctrl+Z: يرسل SIGSTP، الإشارة 20، إلى العملية ويطلب منها التوقف (التعليق) والتحول إلى عملية خلفية.
  • الوظائف: تسرد الوظائف الخلفية وتظهر رقم الوظيفة الخاصة بها.
  • bg job_number: إعادة تشغيل عملية خلفية. إذا لم تقم بتوفير رقم وظيفة، فسيتم استخدام آخر عملية تم تحويلها إلى مهمة خلفية.
  • fg job_number: يقوم بجلب عملية خلفية إلى المقدمة وإعادة تشغيلها. إذا لم تقم بتوفير رقم وظيفة، فسيتم استخدام آخر عملية تم تحويلها إلى مهمة خلفية.
  • سطر الأوامر &: يؤدي إضافة علامة & إلى نهاية سطر الأوامر إلى تنفيذ هذا الأمر كمهمة خلفية قيد التشغيل.
  • قتل %job_number: يرسل SIGTERM، الإشارة 15، إلى العملية لإنهائها.
  • قتل 9 %job_number: يرسل SIGKILL، الإشارة 9، إلى العملية وينهيها فجأة.


أضف تعليق