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

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




HUP و SIGHUP

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

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

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


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

يتم إرسال الإشارة إلى البرامج حتى يتم إعلامها بـ HUP ومعرفة أنه يجب إنهاءها.

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

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

أمر nohup

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


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

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


استخدام nohup

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

./long-proc

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

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

nohup ./long-proc

تشغيل برنامج long-proc من nohup


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

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

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

لقد تم التقاط مخرجات البرنامج لنا في ملف يسمى “nohup.out”. يمكننا مراجعته بشكل أقل.

less nohup.out


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

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

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

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

nohup ./long-proc &


تشغيل برنامج long-proc باستخدام nohup وجعله مهمة خلفية

سوف تحتاج إلى الضغط على “Enter” مرة أخرى للعودة إلى موجه الأوامر. لقد تم إخبارنا أن رقم المهمة للعملية هو 1 — الرقم بين قوسين “()“— وأن معرف العملية هو 13115.

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

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

jobs

إدراج المهام الخلفية التي تم تشغيلها من نافذة المحطة الطرفية


لقتل مهمتنا يمكننا استخدام kill الأمر ورقم المهمة، مسبوقًا بعلامة النسبة المئوية “%“، مثله:

kill %1

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

pgrep long-proc

العثور على معرف العملية عن طريق الاسم

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

kill 13115

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


في المرة التالية التي تضغط فيها على “Enter” سيتم إعلامك بأن العملية قد تم إنهاؤها.

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

nohup ./long-proc

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

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

pgrep long-proc

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


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

بعد قولي هذا، لبدء العديد من العمليات في وقت واحد، استخدم nohup لتشغيل غلاف Bash واستخدامه -c خيار (الأوامر) مع سلسلة الأوامر. استخدم علامات الاقتباس المفردة “'“لتغليف قائمة الأوامر وعلامات الجمع المزدوجة”&&” لفصل الأوامر.

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

إطلاق عمليتين باستخدام nohup


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

less 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” مع أقل.

less myfile.txt

فتح ملف myfile.txt في أقل


كما هو الحال في السابق، فهو يحتوي على الناتج من كلا الأمرين.

إخراج الأوامر الملتقطة في الملف المحدد للمستخدم myfile.txt في أقل من


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

أضف تعليق