كيفية استخدام أمر nohup في Linux
نشرت: 2022-06-25 يتيح أمر Linux nohup
استمرار تشغيل العمليات المهمة حتى عند إغلاق نافذة المحطة الطرفية التي أطلقت هذه العمليات. نوضح لك كيفية استخدام هذا الأمر الموقر على Linux اليوم.
HUP و SIGHUP
تم إنشاء Unix ، سلف Linux ، قبل اختراع الكمبيوتر الشخصي. كانت أجهزة الكمبيوتر عبارة عن قطع كبيرة من المعدات باهظة الثمن. تفاعل الأشخاص معهم عبر خطوط تسلسلية إما محليًا داخل نفس المبنى أو عن بُعد عبر اتصالات مودم بطيئة. في الأصل ، قاموا بكتابة تعليماتهم على الطابعات عن بعد التي تم استبدالها تدريجياً بأجهزة طرفية غبية.
لقد تم تسميتهم بالغباء لأن قوة المعالجة كانت في الكمبيوتر الذي كنت متصلاً به ، وليس الجهاز الطرفي الذي كنت تكتب عليه. كانت البرامج تعمل على الكمبيوتر - في أي مكان قد يكون موجودًا - وليس على الجهاز الموجود على مكتبك.
إذا حدث شيء أدى إلى قطع الاتصال بين الجهاز الطرفي والكمبيوتر ، فقد اكتشف الكمبيوتر انخفاض الخط وأرسل HUP
أو قطع الإشارة إلى البرامج التي كنت تقوم بتشغيلها. توقفت البرامج عن التنفيذ عندما تلقت الإشارة.
هذه الوظيفة موجودة في 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
إذا كان هذا برنامجًا قدم شيئًا مفيدًا وأردنا استمراره في العمل حتى لو تم إغلاق نافذة الطرفية و shell ، فسنقوم بتشغيله باستخدام nohup
.
nohup ./long-proc
يتم فصل العملية عن stdin
و stdout
لذلك لا يمكنها تلقي أي إدخال أو الكتابة إلى النافذة الطرفية. أيضًا ، نظرًا لأنه لا يزال قيد التشغيل ، فلن يتم إرجاعك إلى موجه الأوامر. كل ما تفعله nohup
هو جعل العملية منيعة أمام إغلاق المحطة. لا يحول العملية إلى مهمة خلفية.
هل يتعين عليك الآن إعادة التشغيل فقط لإنهاء العملية؟ لا. لإيقاف عملية nohup
التي لم تبدأها كخلفية ، اضغط على مجموعة المفاتيح Ctrl + C.
تم التقاط مخرجات البرنامج لنا في ملف يسمى "nohup.out". يمكننا مراجعتها بأقل من ذلك.
أقل nohup.out
يتم تسجيل أي شيء يتم إرساله عادةً إلى النافذة الطرفية في الملف. سيتم إلحاق عمليات التشغيل اللاحقة من nohup
بملف "nohup.out" الحالي.
هناك طريقة أكثر فائدة لتشغيل العملية وهي تشغيلها باستخدام nohup
بحيث تصمد أمام إغلاق نافذة المحطة الطرفية ، ولجعلها مهمة في الخلفية في نفس الوقت. للقيام بذلك نضيف علامة " &
" في نهاية سطر الأوامر.
nohup ./long-proc &
ستحتاج إلى الضغط على "Enter" مرة أخرى للعودة إلى موجه الأوامر. تم إخبارنا أن رقم المهمة للعملية هو 1 - الرقم الموجود بين قوسين " []
" - وأن معرف العملية هو 13115.
يمكننا استخدام أي منهما لإنهاء العملية. لن يعمل "Ctrl + C" الآن لأن البرنامج ليس له أي ارتباط بالنافذة الطرفية أو الصدفة.
إذا نسيت رقم الوظيفة ، يمكنك استخدام الأمر jobs
لسرد مهام الخلفية التي تم إطلاقها من نافذة المحطة الطرفية.
وظائف
لقتل مهمتنا ، يمكننا استخدام أمر kill
ورقم الوظيفة ، مسبوقًا بعلامة النسبة المئوية " %
" ، على النحو التالي:
اقتل٪ 1
إذا قمت بإغلاق نافذة المحطة الطرفية ، فستحتاج إلى العثور على معرف العملية واستخدامه مع أمر kill
. سيجد الأمر pgrep
معرّف العملية للعمليات التي تطابق دليل البحث الذي تقدمه. سنبحث عن اسم العملية.
pgrep لونغ بروك
الآن يمكننا استخدام معرف العملية لإنهاء العملية.
اقتل 13115
في المرة التالية التي تضغط فيها على "Enter" ، يتم إعلامك بإنهاء العملية.
الآن دعنا ننظر إلى ما لا ينهي العملية. سنعيد تشغيله ، ثم نغلق نافذة المحطة الطرفية.
nohup ./long-proc
إذا فتحنا نافذة طرفية جديدة وبحثنا عن عمليتنا باستخدام pgrep
، فإننا نرى أنها لا تزال قيد التشغيل. لم يكن لإغلاق نافذة المحطة الطرفية التي أطلقت العملية أي تأثير.
pgrep لونغ بروك
من الممكن تمرير أوامر متعددة إلى nohup
، لكن من الأفضل عادةً تشغيلها بشكل منفصل. يجعل من السهل التعامل معها كوظائف في الخلفية. لن يتم تشغيل الأوامر في نفس الوقت ، سيتم تنفيذها واحدة تلو الأخرى. التنفيذ ليس متزامنًا ، إنه متسلسل. لتشغيلها بشكل متزامن ، تحتاج إلى تشغيلها بشكل منفصل.
بعد قولي هذا ، لإطلاق عدة عمليات في وقت واحد ، استخدم nohup
Bash shell واستخدم الخيار -c
(الأوامر) مع سلسلة الأوامر. استخدم علامات الاقتباس المفردة '
" لالتفاف قائمة الأوامر وعلامات العطف المزدوجة " &&
" لفصل الأوامر.
nohup bash -c 'ls / bin && ls / sbin'
إذا كنت تستخدم less
للبحث في ملف "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 يجب أن تعرفه