لينكس 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
تم فصل العملية عن stdin
و stdout
لذا، لا يمكنه تلقي أي إدخال أو الكتابة إلى نافذة المحطة الطرفية. أيضًا، نظرًا لأنه لا يزال قيد التشغيل، فلن تتم إعادتك إلى موجه الأوامر. كل ذلك nohup
إن ما يفعله هذا هو جعل العملية غير قابلة للاختراق عند إغلاق المحطة الطرفية. فهو لا يحول العملية إلى مهمة خلفية.
هل يتعين عليك الآن إعادة التشغيل لإنهاء العملية؟ لا. لإيقاف nohup
إذا لم تقم بتشغيل العملية التي لم تبدأها كعملية خلفية، فاضغط على تركيبة المفاتيح Ctrl+C.
لقد تم التقاط مخرجات البرنامج لنا في ملف يسمى “nohup.out”. يمكننا مراجعته بشكل أقل.
less nohup.out
يتم التقاط أي شيء يتم إرساله عادةً إلى نافذة المحطة الطرفية في الملف. يتم تشغيل عمليات لاحقة من nohup
سيتم إضافته إلى الملف “nohup.out” الموجود.
الطريقة الأكثر فائدة لتشغيل العملية هي تشغيلها باستخدام nohup
حتى يتحمل إغلاق نافذة المحطة الطرفية، ويجعلها مهمة خلفية في نفس الوقت. للقيام بذلك نضيف علامة “&”&
” إلى نهاية سطر الأوامر.
nohup ./long-proc &
سوف تحتاج إلى الضغط على “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
من الممكن تمرير أوامر متعددة إلى nohup
ولكن من الأفضل عادةً تشغيلها بشكل منفصل. فهذا يسهل التعامل معها كوظائف خلفية. لن يتم تشغيل الأوامر في نفس الوقت، بل سيتم تنفيذها واحدة تلو الأخرى. التنفيذ ليس متزامنًا، بل متسلسلًا. لتشغيلها بشكل متزامن، تحتاج إلى تشغيلها بشكل منفصل.
بعد قولي هذا، لبدء العديد من العمليات في وقت واحد، استخدم nohup
لتشغيل غلاف Bash واستخدامه -c
خيار (الأوامر) مع سلسلة الأوامر. استخدم علامات الاقتباس المفردة “'
“لتغليف قائمة الأوامر وعلامات الجمع المزدوجة”&&
” لفصل الأوامر.
nohup bash -c 'ls /bin && ls /sbin'
إذا كنت تستخدم less
للبحث في ملف “nohup.out”، سترى الناتج من العملية الأولى، ثم الناتج من العملية الثانية.
less 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
كما هو الحال في السابق، فهو يحتوي على الناتج من كلا الأمرين.
من المضحك كيف أن تاريخ المرافق العامة قد يجعل الأمر يبدو أحيانًا وكأنه ليس له أي صلة بالأزمنة الحديثة. nohup
يعد الأمر واحدًا من تلك الأوامر. وهو أمر تم إنشاؤه للتعامل مع حالات انقطاع الاتصال على الخطوط التسلسلية ولا يزال مفيدًا لمستخدمي Linux اليوم على الأجهزة القوية بشكل لا يصدق.