سؤال كيفية الحفاظ على تشغيل العمليات بعد إنهاء جلسة ssh؟


لنفترض أنني أطلقت مجموعة من العمليات من جلسة ssh. هل من الممكن إنهاء جلسة ssh مع الحفاظ على تشغيل هذه العمليات على الجهاز البعيد؟


507
2017-10-21 12:09


الأصل


ذات صلة: unix.stackexchange.com/questions/4004/... - Anton Tarasenko


الأجوبة:


يجب أن تبحث عن بدائل حديثة مثل tmux.

tmux متفوقة على screen لأسباب عديدة ، إليك بعض الأمثلة فقط:

  • يمكن نقل Windows بين الجلسة وحتى ربطها بجلسات متعددة
  • يمكن تقسيم Windows أفقياً وعمودياً إلى أجزاء
  • دعم UTF-8 ومحطات 256 لون
  • يمكن التحكم في الجلسات من القشرة دون الحاجة إلى دخول الجلسة

الوظيفة الأساسية

للحصول على نفس الوظائف كما هو موضح في إجابة التوصية screen، ستحتاج إلى القيام بما يلي:

  • سه في الجهاز البعيد
  • بداية tmux عن طريق كتابة tmux في القشرة
  • بدء العملية التي تريدها داخل البداية tmux جلسة
  • ترك / فصل tmux الجلسة عن طريق الكتابة السيطرة+ب وثم د 

يمكنك الآن تسجيل الخروج بأمان من الجهاز البعيد ، وستستمر العملية قيد التشغيل بالداخل tmux. عندما تعود مرة أخرى وتريد التحقق من حالة العملية التي يمكنك استخدامها tmux attach لتعلق على الخاص بك tmux جلسة.

إذا كنت ترغب في الحصول على جلسات متعددة تعمل جنبًا إلى جنب ، فيجب تسمية كل جلسة باستخدامها السيطرة+ب و $. يمكنك الحصول على قائمة من الجلسات الجارية حاليا باستخدام tmux list-sessions، الآن نعلق على جلسة قيد التشغيل مع الأمر tmux attach-session -t 0.

tmux يمكن أن تفعل أشياء أكثر تقدما من التعامل مع نافذة واحدة في جلسة واحدة. لمزيد من المعلومات إلقاء نظرة عليها man tmux أو صفحة tmux GitHub. خاصه، هنا هو التعليمات حول الاختلافات الرئيسية بين screen و tmux.


597
2017-11-23 09:26



CraigM الاستخدام screen -x -r [screenname] أو screen -rx باختصار إذا كان لديك جلسة شاشة واحدة فقط نشطة. يتيح لك ذلك إرفاق نسخة شاشة موجودة. - Lekensteyn
ساعدتني هذه النصيحة في نفس المشكلة ولكن أعتقد أنها تتضمن خطأ مطبعيًا. أنا متأكد من أنك بحاجة إلى الكتابة Ctrl-b وثم d من أجل مغادرة / فصل tmux جلسة. بالتأكيد هذا هو الحال بالنسبة لإصدار tmux على Ubuntu 12.04. - cxrodgers
لقد ارتكبت خطأ أثناء اتباع الإرشادات الواردة أعلاه. سوف أشاركه إذا كان أي شخص قد يقع في نفس الخطأ: لقد بدأت tmux في وعاء جهاز الكمبيوتر الخاص بي بدلاً من shell للكمبيوتر البعيد. يحتاج المرء لبدء tmux في وعاء الكمبيوتر البعيد. - Mert Nuhoglu
يتم الآن تطوير الشاشة مرة أخرى: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html هل يمكنك تحديث إجابتك؟ - muru
بدلا من ذلك ، تشغيل tmux detach بدلا من الكتابة ctrl-b d - Andrew MacFie


أفضل طريقة هي أبسط في كثير من الأحيان.

nohup long-running-command &

تم إجراءه خصيصًا لهذا ، حتى أنه يسجل stdout إلى nohup.log

man nohup

إذا كنت تريد "الخلفية" بعض المهام قيد التشغيل بالفعل ، فإن أفضل رهان هو ctrl + z ثم تشغيل

bg (سيؤدي ذلك إلى خلفية آخر مهمة تم تعليقها ، مما يسمح لها بالاستمرار في العمل)

ثم سريع disown يجب أن تبقي العملية قيد التشغيل بعد تسجيل الخروج.

screen ويمكن للآخرين فعل ذلك ، لكن هذا ليس ما يفعلونه. أوصي nohup للمهام التي تعرفها سوف تخلفها و تتركها bg للمهام التي تشغلها بالفعل ولا تريد إعادة التشغيل.

ضع في اعتبارك ، كلاهما bash خاص. إذا كنت لا تستخدم bash ، فقد تكون الأوامر مختلفة.


217
2017-11-28 02:58



أوصي به disown -h - Michele
شاشة مثيرة للاهتمام و tmux لا يعمل لعمال المناجم والبور نوهوب - Yasin Okumuş
bg + disownلم يعمل لي كان لدي برنامج نصي للنشر قيد التشغيل نسيت أن أبدأ داخل tmux ، وتحتاج إلى مغادرة مبكرة للاجتماع. البرنامج النصي بإخراج التقدم إلى shell بشكل مستمر. ctrl+z أوقف العملية ، أعيدني إلى bash. bg استأنفت العملية ، لكنها استأنفت أيضا إخراج الوضع إلى bash ، مما يجعل من المستحيل رؤية ما كنت أكتب. ومع ذلك ، أ disown أنتج الأمر "نزول: الحالي: لا يوجد مثل هذه الوظيفة" - BrianHVB


يمكنك القيام بذلك عن طريق استخدام screen.

اكتب man screen لمعرفة المزيد أو قراءة هذا صفحة رجل الشاشة.

سيناريو بسيط:

  • ssh في المربع البعيد الخاص بك. اكتب screen ثم ابدأ العملية التي تريدها.

  • صحافة السيطرة-ا ثم السيطرة-د. سيؤدي هذا إلى "فصل" جلسة الشاشة الخاصة بك مع ترك العمليات قيد التشغيل. يمكنك الآن تسجيل الخروج من المربع البعيد.

  • إذا كنت تريد العودة لاحقًا ، فقم بتسجيل الدخول مرة أخرى واكتب screen -r سيؤدي هذا إلى "استئناف" جلسة الشاشة الخاصة بك ، ويمكنك رؤية إخراج العملية الخاصة بك.


179
2017-10-21 12:20



سأقوم عادةً بتسمية جلسات الشاشة الخاصة بي باستخدام screen -S name لتسهيل الاتصال بالحدث الصحيح لاحقًا. - David Oneill
الرابط هو أسفل - Gab是好人
أنا شخصياً أعمل على صندوق بدون أي برنامج للتحكم في الحزمة. بعد أن أمضى حوالي نصف ساعة من الاعتماد على المباني لـ TMUX (التي كنت شخصياً لدي خبرة بها وإعجابي بها) من المصدر ، أصبح من الواضح أن الشاشة كانت الحل الأفضل والأبسط بالنسبة لي. TL: DR: الحل الأمثل لهذه المشكلة يعتمد على حالة الاستخدام ، الجهاز ، وكم من الوقت لديك لإعداد. شكرا على هذا الجواب :) - Max von Hippel
مع تركيبة screen -S قبل المغادرة و screen -r عندما تعود رائع! - Meloman
شكرا على هذا. هذا الحل يعمل بالنسبة لي في حين لم tmux (أنا استخدم إصدار bash للنوافذ أثناء ssh'ing في آلة لينكس) - Michael Sorensen


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

disown [-ar] [-h] [jobspec… |pid… ]

بدون خيارات ، قم بإزالة كل منها jobspec من جدول الوظائف النشطة. إذا كان -h يتم إعطاء الخيار ، لا تتم إزالة المهمة من الجدول ، ولكن يتم وضع علامة بحيث لا يتم إرسال SIGHUP إلى المهمة إذا كان shell يستلم SIGHUP. إذا jobspec غير موجود ، ولا -a ولا -r يتم توفير الخيار ، يتم استخدام المهمة الحالية. إذا لا jobspec يتم توفير ، و -a الخيار يعني إزالة أو تحديد كل الوظائف ؛ ال -r الخيار دون jobspec حجة يقيد التشغيل لتشغيل وظائف.

مع التبرؤ يمكنك إغلاق المحطة وتشغيل العملية على الجهاز.


72
2017-10-21 13:19



هذا هو أيضا طريقي المفضل للقيام بذلك. أنا كثيرا ما استخدم disown -a && exit - Stefano Palazzo♦
في احسن الاحوال. هذا أمر جميل ويستحق كل upvotes! - Greg
كلمة واحدة من الحذر ، توقفت عن تشغيل عملية مع Ctrl-Z ولم تبدأ في الخلفية قبل الاتصال disown وقتلها. - HDave
قد يتعطل إذا كان يريد الكتابة إلى المحطة. ليس من السهل إعادة توجيه مخرجات عملية التشغيل. من الأفضل أن تبدأ بشكل صحيح مع nohup. - jiggunjer
هذه إجابة جيدة ، لأنها تجيب بشكل مباشر على السؤال. سأل المؤلف السؤال ماذا تفعل بعد بعد أن نفذت بالفعل حفنة من أوامر تشغيل طويلة. معظم هذه الإجابات تتيح لك معرفة ما يجب القيام به قبل تقوم بتنفيذ الأوامر. - q0rban


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

  1. سه [خادم]
  2. أمر
  3. CTRL + Z
  4. حرس الحدود
  5. تبرأ من
  6. ىخرج

الخطوة 3 توقف العملية الحالية مؤقتًا (على سبيل المثال ، أمر "mv" الخاص بي). الخطوة الرابعة تضع العملية المتوقفة مؤقتًا في الخلفية وتستأنفها. تسمح لك الخطوة 5 بإبطال العملية.


37
2017-11-25 03:30



المدمج في هي دائما خياري الأول :) THX - ken_oy
يجب وضع علامة على هذه الإجابة على أنها صحيحة. التثبيت والتعود على الشاشة لحل هذه المشكلة أمر مبالغ فيه. - Ulrich-Lorenz Schlüter
هذا أمر مفيد للغاية عندما تكون قد بدأت بالفعل أي أمر والذي يتم تشغيله لفترة طويلة. إن إﻧﻬﺎء وﺗﺸﻐﻴﻠﻪ ﻓﻲ ﺟﻠﺴﺔ ﺗﺎﻛﺴﻮ ﺳﻮف ﻳﺴﺘﻐﺮق وﻗﺘﺎً - Deepali Mittal


هناك نوعان من البرامج الرئيسية التي يمكنك استخدامها للحفاظ على البرامج والحالة الطرفية عبر اتصالات ssh متعددة. هم الشاشة (شاغل الوظيفة ، ولكن لسوء الحظ غير مؤكد. على ما يبدو يجري تطويرها بنشاط الآن) و tmux (الأحدث ، الحفاظ عليها بنشاط). تعتبر Byobu واجهة أمامية يمكن تشغيلها فوق هذه الأنظمة وتقدم معلومات إضافية عن حالة ubuntu. في التركيبات الجديدة ، ستستخدم tmux كخلفية ، إذا كان لديك تثبيت قديم لـ byobu وتهيئة موجودة ، فستحافظ على الخلفية السابقة ، سواء كانت شاشة أو tmux.

Byobu

يمكن تثبيت Byobu على الكمبيوتر عن طريق القيام بذلك في جهاز يعمل بنظام Debian:

sudo aptitude install byobu

باستخدام yum ، يمكنك القيام به

su -c 'yum install byobu'

من الممكن أيضًا تثبيت byobu على توزيعات أخرى.

باستخدام byobu

يمكنك البدء byobu عن طريق تشغيل byobu على الجهاز المضيف بعد الاتصال باستخدام ssh. سيعطيك هذا غلافًا يبدو كالتالي:

image-byobu

يمكنك أيضا استخدام Byobu الطرفية على جهاز Ubuntu مع خيار X ، وبسهولة يكون عمل byobu تماما.

الاستعمال:

بدء byobu بكتابة byobu.

يمكنك الضغط على F2 لإنشاء نافذة جديدة داخل الجلسة الحالية ، F3-F4 للتبديل بين النوافذ المختلفة.

أفضل جزء عن byobu هو ، ليس لديك بالفعل لقتل العمليات التي تعمل في المحطة لمغادرة المحطة. يمكنك ببساطة إرسال شاشة / tmux (الهيكل العظمي لـ byobu) إلى الخلفية واستئنافها في المرة القادمة التي تأتي فيها:

  • لترك byobu و keeep تشغيله (فصل) اضغط F6.
  • في المرة القادمة التي تأتي ، فقط افعل byobu وستعود إلى مكانك الصحيح.

    byobu-detach-attach

يمكنك أيضًا إنشاء جلسات byobu المختلفة بواسطة byobu -S session1 وما إلى ذلك وهلم جرا. ويمكنك الاتصال بأي منهما عند عودتك.

يمكنك أن تفعل أكثر بكثير باستخدام Byobu. استخدمه! بعض الأدلة النهائية هي هنا، هنا أو هنا.


19
2017-11-24 22:09



حاولت استخدام byobu من جلسة مبنية على PuTTY إلى مربع أوبونتو الخاص بي ، لكنني أتلقى تكرار خط الحالة وتمريره على الشاشة. على الرغم من أنه فصل بشكل صحيح ون الضغط على F6 ، إلا أنه لم يكن حلاً قابلاً للاستخدام في إعدادي. - jfmessier
jfmessier ذلك لأن PuTTY لا يأخذ ncurses (utf-8 أساسا) بشكل جيد. من الممكن إزالة هذه المشكلة عن طريق اتباع هذا الموضوع - stackoverflow.com/questions/10731099/... - SiddharthaRT
هذا رائع! 1. أنه يعطيني دفع bash ملون لا يبدو لي تمكين مع bash كما بلدي شل الافتراضي و 2. أحصل على تشغيل 2 bots في نفس الوقت و ما يزال لدينا محطة أخرى للعمل على! SiddharthaRT أنت تستحق سيد upvote! - Dev


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

يمكنك استخدام nohup لكن الحكمة الحديثة تقترح عليك استخدام الشاشة أو البينوبو كتسجيل الدخول الخاص بك حتى يمكنك فصل وترك الأشياء قيد التشغيل.

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

هناك بداية معقولة دليل على الشاشة هنا.

byobu يضع واجهة سهلة الاستخدام في أعلى الشاشة مع القوائم وما إلى ذلك. كما أنه التطبيق الحالي للشاشة على أوبونتو الأحدث. F2 لبدء محطة جديدة F3 / F4 للتبديل ذهابا وإيابا و F6 لقطع الاتصال. اكتب exit لإنهاء المطاريف النهائية بشكل دائم.


16
2017-10-21 12:16



يستخدم byobu tmux هذه الأيام .. - scottl
"لا يمكنك القيام بذلك بمجرد بدء العملية ، تحتاج إلى تعيين الأشياء قبل تشغيل مهمة تشغيل طويلة." - لا ، يمكنك استخدامها disown لتحقيق هذا. انظر @ الجواب bassgey ل - Rich
بعد تكافح من أجل تعلم الشاشة و tmux .... byobu جلبت دموع لعيني - HDave
disown وإذا لزم الأمر فقط Ctrl-z، ثم bg للحصول عليها من المحطة النشطة والخلفية. ثم، disown. - mimoralea


مهلا ، بينما وافقت على أن الشاشة هي الخيار الأكثر فعالية. يمكنك استخدام vncserver ثم البدء في العملية عليه.

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

تحتاج أولاً إلى إرسال العملية إلى الخلفية بكتابة Ctrl + Z متبوعة بـ bg٪ 1 (يعتمد الرقم على رقم المهمة ، وعادةً ما يكون 1 ، ولكن يمكنك بسهولة سحب القائمة باستخدام مهام الأوامر)

أخيرا استدعاء الأمر المهدر (تليها jobid ... نفس الأمر مع bg)

سيؤدي ذلك إلى إزالة العلاقة بين الوالدين والطفل بين صدفة الخاص بك والعملية في الخلفية ، مما يمنعها من الموت عند إنهاء shell الخاص بك.


7
2018-06-06 21:29



هذا الجواب هو الأفضل! لماذا الجميع يتحدث عن screen، تم طرح السؤال بعد حدث تسجيل الدخول ، وكيفية الحفاظ على تشغيل العمليات ، والآن بعد تسجيل الدخول ولكن قبل البدء بها. إجابة رائعة يا جورج ، لقد ساعدتني حقًا! :) - jwbensley
ببساطة bg (بدون %1) غالبًا ما يكفي ، لأن الافتراضي هو المهمة الحالية - Walter Tross
سيكون من اللطيف الحصول على إجابة شاملة: A Priori (الإعداد المسبق): ascii terminal screen (old)، tmux (neewer)؛ النوافذ X: vnc (القديمة ، لا تزال تحتفظ) ، xpra (الأحدث) ، مع xpra كونها بلا جذور. A الخلفي (تستمر بعد أن بدأت): ^ Z ، يتبرأ ، ... ولكن أنا كسول جدا لحمها أكثر من هذا. - Krazy Glew