كيفية استخدام أمر nohup في Linux

نشرت: 2022-06-25
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

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

HUP و SIGHUP

تم إنشاء Unix ، سلف Linux ، قبل اختراع الكمبيوتر الشخصي. كانت أجهزة الكمبيوتر عبارة عن قطع كبيرة من المعدات باهظة الثمن. تفاعل الأشخاص معهم عبر خطوط تسلسلية إما محليًا داخل نفس المبنى أو عن بُعد عبر اتصالات مودم بطيئة. في الأصل ، قاموا بكتابة تعليماتهم على الطابعات عن بعد التي تم استبدالها تدريجياً بأجهزة طرفية غبية.

لقد تم تسميتهم بالغباء لأن قوة المعالجة كانت في الكمبيوتر الذي كنت متصلاً به ، وليس الجهاز الطرفي الذي كنت تكتب عليه. كانت البرامج تعمل على الكمبيوتر - في أي مكان قد يكون موجودًا - وليس على الجهاز الموجود على مكتبك.

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

كيف تقتل تطبيق سطح المكتب أو عملية الخلفية على Linux
ذات صلة كيفية قتل تطبيق سطح المكتب أو عملية الخلفية على لينكس

هذه الوظيفة موجودة في Linux اليوم. على جهاز الكمبيوتر الخاص بك ، تعد النافذة الطرفية محاكاة لمحطة مادي. إذا كانت لديك عمليات قيد التشغيل تم إطلاقها من نافذة المحطة الطرفية تلك وقمت بإغلاق تلك النافذة ، فسيتم إرسال إشارة SIGHUP إلى البرامج بحيث يتم إبلاغهم بـ HUP ويعرفون أنه يجب إنهاءهم.

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

يقوم أمر nohup بتشغيل العمليات الفرعية ولكنه يرفض تمرير إشارات SIGHUP إليهم. قد يبدو هذا وكأنه مشكلة ، لكنه في الواقع وظيفة مفيدة.

أمر nohup

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

هذا ما تفعله nohup . يقوم بتشغيل البرامج من أجلك بحيث تكون عملية فرعية لـ nohup ، وليست عملية فرعية من shell. نظرًا لأنهم ليسوا عملية فرعية للقذيفة ، فلن يتلقوا SIGHUP مباشرة من الغلاف. وإذا لم تمرر nohup برنامج SIGHUP لأطفالها ، فلن يتلقى البرنامج SIGHUP على الإطلاق.

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

باستخدام nohup

لقد أنشأنا برنامجًا لا يفعل أي شيء مفيد ، لكنه سيعمل ويعمل حتى يتم إنهاؤه. يقوم بطباعة الوقت إلى نافذة المحطة كل ثلاث ثوانٍ. يطلق عليه اسم "عملية long-proc ".

 ./long-proc 

يقوم برنامج long-proc بتشغيل نافذة طرفية

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

 nohup ./long-proc 

إطلاق برنامج long-proc من nohup

يتم فصل العملية عن stdin و stdout لذلك لا يمكنها تلقي أي إدخال أو الكتابة إلى النافذة الطرفية. أيضًا ، نظرًا لأنه لا يزال قيد التشغيل ، فلن يتم إرجاعك إلى موجه الأوامر. كل ما تفعله nohup هو جعل العملية منيعة أمام إغلاق المحطة. لا يحول العملية إلى مهمة خلفية.

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

إيقاف عملية المعالجة الطويلة باستخدام Ctrl + C

تم التقاط مخرجات البرنامج لنا في ملف يسمى "nohup.out". يمكننا مراجعتها بأقل من ذلك.

 أقل nohup.out 

فتح ملف nohup.out بأقل

يتم تسجيل أي شيء يتم إرساله عادةً إلى النافذة الطرفية في الملف. سيتم إلحاق عمليات التشغيل اللاحقة من nohup بملف "nohup.out" الحالي.

الإخراج من عملية طويلة مكتوبة إلى ملف nohup.out ، معروضة بحجم أقل

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

 nohup ./long-proc & 

إطلاق برنامج long-proc مع nohup وجعله مهمة خلفية

ستحتاج إلى الضغط على "Enter" مرة أخرى للعودة إلى موجه الأوامر. تم إخبارنا أن رقم المهمة للعملية هو 1 - الرقم الموجود بين قوسين " [] " - وأن معرف العملية هو 13115.

يمكننا استخدام أي منهما لإنهاء العملية. لن يعمل "Ctrl + C" الآن لأن البرنامج ليس له أي ارتباط بالنافذة الطرفية أو الصدفة.

إذا نسيت رقم الوظيفة ، يمكنك استخدام الأمر jobs لسرد مهام الخلفية التي تم إطلاقها من نافذة المحطة الطرفية.

 وظائف 

سرد مهام الخلفية التي تم إطلاقها من نافذة طرفية

لقتل مهمتنا ، يمكننا استخدام أمر kill ورقم الوظيفة ، مسبوقًا بعلامة النسبة المئوية " % " ، على النحو التالي:

 اقتل٪ 1

إذا قمت بإغلاق نافذة المحطة الطرفية ، فستحتاج إلى العثور على معرف العملية واستخدامه مع أمر kill . سيجد الأمر pgrep معرّف العملية للعمليات التي تطابق دليل البحث الذي تقدمه. سنبحث عن اسم العملية.

 pgrep لونغ بروك 

العثور على معرف العملية لعملية بالاسم

الآن يمكننا استخدام معرف العملية لإنهاء العملية.

 اقتل 13115 

استخدام أمر القتل ومعرف العملية لإنهاء العملية

في المرة التالية التي تضغط فيها على "Enter" ، يتم إعلامك بإنهاء العملية.

الآن دعنا ننظر إلى ما لا ينهي العملية. سنعيد تشغيله ، ثم نغلق نافذة المحطة الطرفية.

 nohup ./long-proc 

إغلاق نافذة المحطة مع تشغيل العملية

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

 pgrep لونغ بروك 

استخدام pgrep للبحث عن عملية بالاسم

من الممكن تمرير أوامر متعددة إلى nohup ، لكن من الأفضل عادةً تشغيلها بشكل منفصل. يجعل من السهل التعامل معها كوظائف في الخلفية. لن يتم تشغيل الأوامر في نفس الوقت ، سيتم تنفيذها واحدة تلو الأخرى. التنفيذ ليس متزامنًا ، إنه متسلسل. لتشغيلها بشكل متزامن ، تحتاج إلى تشغيلها بشكل منفصل.

بعد قولي هذا ، لإطلاق عدة عمليات في وقت واحد ، استخدم nohup Bash shell واستخدم الخيار -c (الأوامر) مع سلسلة الأوامر. استخدم علامات الاقتباس المفردة ' " لالتفاف قائمة الأوامر وعلامات العطف المزدوجة " && " لفصل الأوامر.

 nohup bash -c 'ls / bin && ls / sbin' 

إطلاق عمليتين مع nohup

إذا كنت تستخدم less للبحث في ملف "nohup.out" ، فسترى الناتج من العملية الأولى ، ثم الناتج من العملية الثانية.

 أقل nohup.out 

فتح ملف nohup.out بأقل

تم تسجيل الإخراج من كلا الأمرين في ملف “nohup.out”. إنه غير متشابك ، يبدأ الإخراج من العملية الثانية فقط بمجرد إنهاء العملية الأولى.

محتويات ملف nohup.out أقل

إذا كنت تريد استخدام ملف خاص بك بدلاً من "nohup.out" ، فيمكنك إعادة توجيه الأمر إلى الملف الذي تختاره.

 nohup bash -c 'ls / bin && ls / sbin'> myfile.txt 

إعادة توجيه الإخراج من العمليات إلى ملف يوفره المستخدم

لاحظ أن الرسالة لم تعد تقول "إلحاق الإخراج بـ nohupo.out" ، بل تقول "إعادة توجيه stderr إلى stdout" ونحن نعيد توجيه stdout إلى ملفنا "myfile.txt".

يمكننا البحث داخل ملف “myfile.txt” بأقل من ذلك.

 أقل myfile.txt 

كما كان من قبل ، يحتوي على الإخراج من كلا الأمرين.


من المضحك كيف يمكن لتاريخ الأداة في بعض الأحيان أن يجعلها تبدو وكأنها لا علاقة لها بالعصر الحديث. أمر nohup هو أحد هؤلاء. شيء تم إنشاؤه للتعامل مع انقطاع الاتصال على الخطوط التسلسلية لا يزال مفيدًا لمستخدمي Linux اليوم على أجهزة قوية بشكل لا يصدق.

ذات صلة: 37 أمرًا مهمًا من أوامر Linux يجب أن تعرفه