سؤال الحفاظ على تشغيل عملية linux بعد خروجي


أقوم بالاتصال بجهاز لينكس من خلال SSH ، وأحاول تشغيل برنامج نصي bash ثقيل يجعل عمليات نظام الملفات. من المتوقع أن تستمر في العمل لساعات ، ولكن لا يمكنني ترك جلسة SSH مفتوحة بسبب مشكلات اتصالات الإنترنت التي أمتلكها.

أشك في أن تشغيل البرنامج النصي مع مشغل الخلفية ، العطف (&) ، وسوف تفعل خدعة ، لأنني حاولت ذلك ووجدت في وقت لاحق أن العملية لم تكتمل. كيف يمكنني تسجيل الخروج والحفاظ على تشغيل العملية؟


139
2017-09-15 06:00


الأصل




الأجوبة:


أفضل طريقة هي بدء العملية في جهاز مضاعف طرفي. بدلاً من ذلك ، يمكنك جعل العملية لا تتلقى إشارة HUP.


ا مضاعف المحطة توفر أجهزة طرفية "افتراضية" تعمل بشكل مستقل عن المطراف "الحقيقي" (في الواقع كل المحطات الطرفية اليوم هي "افتراضية" ولكن هذا موضوع آخر ليوم آخر). ستظل الوحدة الطرفية الظاهرية قيد التشغيل حتى إذا كانت محطتك الفعلية مغلقة بجلسة ssh الخاصة بك.

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

اثنين من مضاعفات محطة شعبية هي شاشة و tmux.

الشاشة لديها منحنى التعلم حاد. هنا هو برنامج تعليمي جيد مع المخططات تشرح المفهوم: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


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

هناك طريقتان سهلتان للقيام بذلك nohup و disown.

لمزيد من المعلومات حول كيف nohup و disown يعمل قراءة هذا السؤال والجواب: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

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


133
2017-09-15 06:05



أنا أحب هذه الإجابة لأنها توفر حلاً لكل من الحالات التفاعلية وغير التفاعلية. في الحالة التفاعلية ، screen يعطيك الكثير من الخيارات ، ولكن إذا كنت تستخدم authorized_keys للسماح للأشخاص بتشغيل نص برمجي عن بُعد عبر ssh، ال nohup الخيار هو طريقة بسيطة لطيفة للبرنامج النصي لبدء العمليات التي تستمر لفترة أطول من ssh الدورة المستخدمة لبدء تشغيلها. - Mark Booth
rahmanisback - تذكر أنه يمكنك تغيير إجابتك المقبولة في أي وقت. فقط لأن إجابة إيريكا حتى الآن هي الأكثر تصويتًا لا تعني أنها أفضل إجابة لك ، بل قد تجعلها جوابك المقبول قد تشجع المزيد من الناس على التصويت كإجابة جيدة. - Mark Booth
* السعال * * * السعال tmuxisbetter - crasic
tmux > الشاشة. جربها ، لن تعود أبدًا. - h0tw1r3
TheLQ - byobu هو جنو الشاشة. مازلت تستخدم الشاشة ، فقط باستخدام .creenrc مخصص للغاية. - EEAA


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

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

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

عندما تريد إعادة الاتصال بجلسة الشاشة ، فقط قم بتشغيل screen -RD من مطالبة shell (كمستخدم الاستخدام نفسه الذي أنشأ الجلسة).


92
2017-09-15 06:07



رائع! الجواب لطيف ، شكرا ... - rahmanisback
تحتوي الشاشة على مجموعة كاملة من الأوامر ، تبدأ جميعها بـ Ctrl-a. إذا كنت تعلم واحد إضافي فقط ، فابدأ بـ "Ctrl-a". عندها لن تتعلم "Ctrl-a c" و "Ctrl-a n" - olafure
olafure +1 ، شكرًا. يبدو أن الشاشة ستكون من صندوق الأدوات الأساسي. - rahmanisback
tmux > الشاشة. جربها ، لن تعود أبدًا. - h0tw1r3
+1 لـ tmux. لقد تخليت عن الشاشة منذ 5 أسابيع. - Bryan Hunt


في bash، ال disown الكلمة هي مناسبة تماما لهذا. أولاً ، قم بتشغيل العملية الخاصة بك في الخلفية (إما استخدامها &أو ^Z ثم اكتب bg):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

عن طريق كتابة jobs يمكنك أن ترى أن العملية لا تزال مملوكة من قبل shell:

$ jobs
[1]+  Running  wget

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

$ disown

يمكنك تأكيد هذا:

$ jobs
$ logout

يمكنك حتى الجمع بين & و disown على نفس السطر ، مثل:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

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


70
2017-09-15 12:27



هذه إجابة جيدة جدًا ، 1+. التفضيل الوحيد ل nohup أو Screen سيكون استقلال bash ، ويمكن استخدامه مع shell آخر. لكنني سألتزم بنهجك عندما أستخدم باش. - rahmanisback
نعم - هذا هو bash-specific ، لأن bash هو الصدفة الوحيدة التي استخدمتها على الإطلاق. أتساءل عما إذا كانت قذائف أخرى تدعم أي شيء مماثل (أي إطلاق في الخلفية دون nohup) - سيكون رائعا إذا كان شخص ما يمكن نشر إجابات أخرى لقذائف أخرى. - Jeremy Visser
انظر إجابتي التي توضح كيفية القيام بذلك مع أي sh-lookalike - w00t
+1 بسبب القدرة على اتخاذ القرار لاحقًا. فقط هذه اللحظة كان لدي حاجة لهذا. عملت كما هو معلن - code_monk


الأداة nohup ، المتوفرة في معظم مربعات Linux ستفعل ذلك.


37
2017-09-15 06:14



هذا هو أبسط إجابة. يتم توجيه أي إخراج تلقائيًا إلى nohup.out ويمكن فحصه لاحقًا. - Julian
لا يتطلب nohup zsh على الإطلاق. - Aaron Brown
nohup هي الإجابة الصحيحة ، فهي قصيرة دون أي تعليق. - Kinjal Dixit
تم العثور على nohup على أكثر بكثير من الآلات ثم الشاشة ، لذلك يجب أن تعرف كيفية استخدامها. - Zenon


فقط لأكون دقيقة ، سوف أشير tmux، والتي لديها نفس الفكرة الأساسية مثل الشاشة:

يهدف tmux إلى أن يكون بديلاً حديثًا مرخصًا لبطاقات BSD لبرامج مثل شاشة GNU. تشمل الميزات الرئيسية ما يلي:

  • واجهة قيادة قوية ومتسقة وموثقة بشكل جيد وسهل البرمجة النصية.
  • يمكن تقسيم النافذة أفقياً وعمودياً إلى أجزاء.
  • يمكن نقل الأجزاء وتغيير حجمها بحرية ، أو ترتيبها في تخطيطات مسبقة.
  • دعم UTF-8 ومحطات 256 لون.
  • نسخ ولصق مع مخازن مؤقتة متعددة.
  • القوائم التفاعلية لتحديد النوافذ أو الجلسات أو العملاء.
  • قم بتغيير النافذة الحالية من خلال البحث عن النص في الهدف.
  • قفل المحطة ، يدويًا أو بعد انتهاء المهلة.
  • مصدر أساسي نظيف وممتد بسهولة ، BSD مرخص ، تحت التطوير النشط.

ومع ذلك ، فمن السهل جدًا البحث عنه على Google.


27
2017-09-15 06:23



عن طريق "gnu screen" كما يعمل استعلام البحث الخاص بك بشكل جيد. - gnur
+1000 لـ tmux! - mbq


الشاشة مبالغة في جعل عمليات التشغيل قيد التشغيل فقط عند تسجيل الخروج.

محاولة dtach:

dtach هو برنامج مكتوب في C يحاكي ميزة فصل   الشاشة ، والتي تسمح بتنفيذ البرنامج في بيئة   محمي من محطة التحكم. على سبيل المثال ، البرنامج   تحت سيطرة dtach لن تتأثر من كونها المحطة   قطع لسبب ما.

تمت كتابة dtach لأن الشاشة لم تلبي احتياجاتي بشكل كافٍ ؛ أنا   لا يحتاج إلى ميزات إضافية للشاشة ، مثل دعم متعددة   المحطات الطرفية أو دعم المحاكاة الطرفية. كانت الشاشة أيضًا كبيرة جدًا ،   ضخمة ، وكان رمز المصدر الذي كان من الصعب فهمه.

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

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


11
2017-09-15 15:06



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


فيما يلي طريقة لتخفيق أي عملية قذيفة ، لا حاجة إلى برامج خارجية:

( while sleep 5; do date; done ) <&- >output.txt &

عند إغلاق جلسة العمل الخاصة بك ، ستستمر المهمة في العمل كما يتضح من ملف output.txt (الذي يحتوي على التخزين المؤقت بحيث يستغرق بعض الوقت لإظهار غير صفرية). لا تنس أن تقتل عملك بعد الاختبار.

لذلك كل ما عليك القيام به هو stdin وثيقة وخلفية الوظيفة. ليكون جيد حقا ، أولا cd / حتى لا تتمسك بجبل.

هذا يعمل حتى في sh البسيط تحت Solaris.


9
2017-09-16 16:48



مثير للإعجاب. ظهر هذا بعض الأسئلة البارزة. أستطيع أن أرى أن تقوم بتعيين STDIN إلى لا شيء ، و - المشغل أو العامل؟ ماهو الفرق بين < /dev/null و &- ؟ أعتقد أن STDIN (وغيرها من STDOUT و STDERR) يمكن تعيين إما ملف بواسطة < file، أو تيار من <& stream في حالة STDIN. سيكون هو نفسه باستخدام < /dev/null في المثال الخاص بك أعلاه؟ وهل المشغل - أعلاه تشير إلى لاغية باعتبارها التيار؟ - rahmanisback
عندما تقوم بعلامة <& -> ، يؤدي ذلك إلى إغلاق واصف الملف x. في هذه الحالة ، لا يوجد x ، مما يجعل bash افتراضيًا إلى 1 ، على سبيل المثال ، الإدخال القياسي. إذا كنت تستخدم </ dev / null فلن تقوم بإغلاق stdin ، فأنت تقوم فقط بإعطاء ملف فارغ إلى البرنامج كمدخل. - w00t
ولكي أكون صادقاً ، لا أعلم حقاً لماذا هذا يخيّم الشيء الذي تشغله :-) إنه يعمل رغم ذلك ، نستخدمه في الإنتاج. لقد اكتشفت ذلك أثناء العبث حول أمل أن أتمكن من تأطير عملية في قذيفة دون الحاجة إلى أي شيء خاص - لذلك بدأت بإغلاق stdin وكان ذلك كافياً. يجب أن أقرأ بعض مصادر الصدف لكنني أفترض أنه إذا قمت بإغلاق العملية وخلفيتها ، فإنها تفصل أيضًا العملية. - w00t
أعتقد أن السبب هو أن SIGHUP (الإشارة الفعلية التي تتسبب في خروج الطفل عند وفاة القشرة) يتم تشغيلها عندما تقوم عملية الوالدين بإغلاق مقبض stdin الخاص بالطفل. ومع ذلك ، إذا ستدين يبدأ كخيار ، بدلا من أن تكون مغلقة بعد الحقيقة ، لا توجد وسيلة للوالدين لتشغيل SIGHUP. بحث جميل ، على الرغم من - لن يفكر في ذلك. - Jeremy Visser
JeremyVisser يبدو هذا معقولًا حقًا! - w00t


ال at الأمر يمكن أن يكون مفيدا لهذا النوع من الحالات. على سبيل المثال ، اكتب:

at now

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

بدلا من now، يمكنك تحديد وقت اختياري مع تاريخ ، أو تعبير الوقت مثل now + 15 minutes. نرى man at لمزيد من التفاصيل.


7
2017-09-16 08:23





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

nohup يسمح ببدء عمل في الخلفية مع توجيه الإخراج إلى ملف السجل ، والذي يمكن دائمًا إعادة توجيهه إلى / dev / null إذا لم يكن مطلوبًا.


7
2017-09-15 13:26