كيفية تشغيل أمر في الخلفية باستخدام ssh وفصل الجلسة

StackOverflow https://stackoverflow.com/questions/1628204

  •  06-07-2019
  •  | 
  •  

سؤال

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

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
هل كانت مفيدة؟

المحلول

هناك بعض المواقف التي تريد فيها تنفيذ/بدء تشغيل بعض البرامج النصية على جهاز/خادم بعيد (والذي سينتهي تلقائيًا) وقطع الاتصال بالخادم.

على سبيل المثال:برنامج نصي يعمل على مربع والذي عند تنفيذه

  1. يأخذ نموذجًا وينسخه إلى خادم بعيد
  2. يقوم بإنشاء برنامج نصي لتشغيل محاكاة مع النموذج ودفعه إلى الخادم
  3. يبدأ البرنامج النصي على الخادم وقطع الاتصال
  4. إن واجب البرنامج النصي الذي بدأ على هذا النحو هو تشغيل المحاكاة في الخادم وبمجرد الانتهاء (سيستغرق الأمر أيامًا حتى يكتمل) قم بنسخ النتائج مرة أخرى إلى العميل.

سأستخدم الأمر التالي:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@CKeven، يمكنك وضع كل هذه الأوامر في برنامج نصي واحد، ودفعه إلى الخادم البعيد وتشغيله على النحو التالي:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

تتمنى ان يعمل ؛-)

يحرر:يمكنك أيضًا استخدام ssh user@host 'screen -s sessionname -d -m "/path/to/execution"' ''

مما يؤدي إلى إنشاء جلسة شاشة منفصلة وتشغيل الأمر المستهدف بداخلها

نصائح أخرى

ما رأيك في استخدام screen لهذا؟يمكنك الركض screen عبر ssh لبدء الأمر (concat.sh) وبعد ذلك ستتمكن من العودة إلى جلسة الشاشة إذا كنت تريد مراقبتها (قد يكون ذلك مفيدًا، اعتمادًا على ما يفعله concat).

لكي تكون أكثر تحديدًا، جرب هذا:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

يجب أن تجد أن المطالبة تعود على الفور، وهذا concat.sh يتم تشغيله على الجهاز البعيد.سأشرح بعض الخيارات:

  • ssh -t يجعل TTY.الشاشة تحتاج إلى هذا.
  • screen -dm يجعله يبدأ في الوضع "المنفصل".هذا يشبه "الخلفية" لأغراضك.
  • -S الاختبار يعطي جلسة الشاشة الخاصة بك اسمًا.إنه اختياري ولكن يوصى به.

الآن، بمجرد الانتهاء من ذلك، يمكنك الانتقال إلى الجهاز البعيد وتشغيل هذا:

screen -r testing

سيؤدي هذا إلى ربطك بجلسة الشاشة التي تحتوي على برنامجك.ومن هناك يمكنك التحكم فيه، وقتله، ورؤية مخرجاته، وما إلى ذلك.Ctrl-A، ثم d سوف يفصلك عن جلسة الشاشة. screen -ls سوف يسرد كافة جلسات التشغيل.

ويمكن أن يكون تيار الإدخال القياسي. محاولة ssh -n ... أو ssh -f ....

وبالنسبة لي، فقط هذا العمل:

screen -dmS name sh my-script.sh

وهذا، بالطبع، يعتمد على الشاشة، ويتيح لك نعلق في وقت لاحق، إذا كنت تريد من أي وقت مضى ستدين أو المعياري. وشاشة وإنهاء نفسها عندما تنتهي my-script.sh.

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

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

ويرسل قائمة $ theStuff من الأوامر إلى علامة التبويب لا $ theTabNumber من الشاشة جلسة $ theScreenSessionName خلق مبدئيا في 'الملقم' باسم 'المستخدم'.

يرجى أن يكون على علم والمسافات الزائدة بعد -X الاشياء \ " التي يتم إرسالها للتغلب على خلل خيار 'الأشياء' في. وإلحاق بيضاء و$ theStuff في السطر التالي من قبل (^ M) ضربات المفاتيح 'أدخل'. لا تفوت "EM!

وو"هذا هو اختبار" وردد رسالة في المحطة الأولى، ويتم تنفيذ أوامر $ theStuff حقا داخل الشاشة / علامة التبويب المذكورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top