في Linux، كيفية منع توقف عملية الخلفية بعد إغلاق عميل SSH

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

سؤال

أنا أعمل على جهاز يعمل بنظام Linux من خلال SSH (Putty).أحتاج إلى ترك العملية قيد التشغيل أثناء الليل، لذلك اعتقدت أنه يمكنني القيام بذلك عن طريق بدء العملية في الخلفية (مع علامة الضم في نهاية الأمر) وإعادة توجيه stdout إلى ملف.لدهشتي، هذا لا يعمل.بمجرد إغلاق نافذة المعجون، يتم إيقاف العملية.

كيف يمكنني منع حدوث ذلك؟؟

هل كانت مفيدة؟

المحلول

وتحقق من برنامج " nohup ".

نصائح أخرى

وأود أن أوصي باستخدام GNU شاشة . انها تسمح لك لقطع من خادم حين أن جميع العمليات الخاصة بك الاستمرار في تشغيل. أنا لا أعرف كيف عشت بدونها قبل كنت أعرف أنها موجودة.

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

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

وdaemonize؟ nohup؟ شاشة؟ (tmux FTW، الشاشة هو غير المرغوب فيه؛ -)

وفقط تفعل ما فعلته كل التطبيق الأخرى منذ بداية - شوكة مزدوجة

# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid:   1
# jobs
# disown
bash: disown: current: no such job

والانفجار! فعلت :-) لقد استعملت هذا مرات لا تحصى على جميع أنواع التطبيقات والعديد من الأجهزة القديمة. يمكنك الجمع بين مع الموجهات وغيرها لفتح قناة خاصة بينك وبين العملية.

إنشاء كما coproc.sh:

#!/bin/bash

IFS=

run_in_coproc () {
    echo "coproc[$1] -> main"
    read -r; echo $REPLY
}

# dynamic-coprocess-generator. nice.
_coproc () {
    local i o e n=${1//[^A-Za-z0-9_]}; shift
    exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
    (("\$@")&) <&$i >&$o 2>&$e
    $n=( $o $i $e )
COPROC
}

# pi-rads-of-awesome?
for x in {0..5}; do
    _coproc COPROC$x run_in_coproc $x
    declare -p COPROC$x
done

for x in COPROC{0..5}; do
. /dev/stdin <<RUN
    read -r -u \${$x[0]}; echo \$REPLY
    echo "$x <- main" >&\${$x[1]}
    read -r -u \${$x[0]}; echo \$REPLY
RUN
done

ثم

# ./coproc.sh 
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main

وهناك تذهب، تفرخ أيا كان. و<(:) يفتح الأنابيب مجهول عبر استبدال العملية، التي يموت، ولكن العصي الأنابيب في جميع أنحاء لديك مؤشر إلى ذلك. وعادة ما تفعل sleep 1 بدلا من : لأن لها مفعم بالحيوية قليلا، وكنت الحصول على "ملف مشغول" خطأ - لم يحدث إذا ركض أمر حقيقي (على سبيل المثال، command true)

و"مصادر heredoc":

. /dev/stdin <<EOF
[...]
EOF

وهذا يعمل على كل قذيفة واحدة لقد حاولت من أي وقت مضى، بما في ذلك BUSYBOX / الخ (initramfs). أنا لم أر قط عليها القيام به من قبل، اكتشفت بشكل مستقل في حين والحث، والذي كان يعرف مصدر يمكن أن يقبل وسائط؟ ولكن في كثير من الأحيان بمثابة شكل أكثر سهولة بكثير من وحدة التقييم، إذا كان هناك شيء من هذا القبيل.

nohup blah &

واستبدال اسم العملية الخاصة بك لبلاه!

وشخصيا، أنا أحب القيادة "دفعة".

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

وهذه المواد في لالخلفية، ومن ثم ترسل بالبريد العادي نتائج لك. انها جزء من كرون.

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

ويمكنك العثور على معلومات حول daemonizing العمليات في الكتب مثل ستيفنز "برنامج شبكة المتقدم، المجلد 1، 3RD EDN" أو Rochkind في "المتقدمة برمجة يونكس".

ومؤخرا (في العامين الماضيين) واضطررت للتعامل مع برنامج المتمردة التي لم daemonize نفسها بشكل صحيح. انتهى بي الأمر التعامل مع ذلك عن طريق إنشاء برنامج daemonizing عام - على غرار nohup ولكن مع المزيد من الضوابط المتاحة

.
Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

وواندفاعة مزدوجة اختيارية على أنظمة لا تستخدم getopt GNU وظيفة ()؛ فمن الضروري (أو لديك لتحديد POSIXLY_CORRECT في البيئة) على لينكس الخ منذ مزدوجة اندفاعة تعمل في كل مكان، فمن الأفضل لاستخدامها.

ويمكنك الاستمرار في الاتصال بي (الاسم الأول نقطة اللقب في جوجل دوت كوم) إذا كنت تريد أن مصدر daemonize.

ومع ذلك، فإن متاحة الآن (النهاية) متوفرة على جيثب في بلدي SOQ (والمكدس أسئلة تجاوز) مستودع كما daemonize-1.10.tgz الملف في حزم شبه دليل.

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

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

على نظام قائم على Debian (على الجهاز البعيد) تثبيت:

Sudo apt-get install tmux

الاستخدام:

com.tmux

تشغيل الأوامر التي تريدها

لإعادة تسمية الجلسة:

السيطرة + ب ثم $

اسم مجموعة

للخروج من الجلسة:

السيطرة + ب ثم د

(وهذا يترك جلسة tmux).وبعد ذلك يمكنك تسجيل الخروج من SSH.

عندما تحتاج إلى العودة/التحقق منه مرة أخرى، قم بتشغيل SSH، ثم أدخل

tmux إرفاق اسم الجلسة

سوف يعيدك إلى جلسة tmux الخاصة بك.

nohup يعد أمرًا جيدًا جدًا إذا كنت تريد تسجيل التفاصيل الخاصة بك في ملف.ولكن عندما ينتقل إلى الخلفية، لا يمكنك إعطائه كلمة مرور إذا طلبت البرامج النصية الخاصة بك ذلك.أعتقد أنك يجب أن تحاول screen.إنها أداة مساعدة يمكنك تثبيتها على توزيعة Linux لديك باستخدام yum على سبيل المثال على CentOS yum install screen ثم قم بالوصول إلى الخادم الخاص بك عبر المعجون أو برنامج آخر، في نوع الصدفة الخاصة بك screen.سيتم فتح الشاشة [0] في المعجون.قم بعملك.يمكنك إنشاء المزيد من الشاشة [1]، والشاشة [2]، وما إلى ذلك في نفس جلسة المعجون.

الأوامر الأساسية التي تحتاج إلى معرفتها:

لبدء الشاشة

شاشة


ل جأعد الشاشة التالية

السيطرة + أ + ج


لتنتقل إلى نالشاشة الخارجية التي قمت بإنشائها

السيطرة + أ + ن


ل دetach

السيطرة + أ + د


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

الشاشة-ص

لإعادة الاتصال بشاشتك، ويمكنك رؤية العملية لا تزال قيد التشغيل على الشاشة.وللخروج من الشاشة اكتب #exit.

لمزيد من التفاصيل انظر man screen.

لمعظم عمليات يمكنك الزائفة daemonize استخدام هذا لينكس سطر الأوامر الخدعة القديمة:

# ((mycommand &)&)

وعلى سبيل المثال:

# ((sleep 30 &)&)
# exit

وبعد ذلك تبدأ نافذة محطة جديدة و:

# ps aux | grep sleep

وسوف تظهر أن sleep 30 لا يزال قيد التشغيل.

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

وأنا أفضل هذا "مجموعة وننسى ذلك" النهج، لا حاجة للتعامل مع nohup، screen، tmux، I / O إعادة توجيه، أو أي من تلك الأشياء.

وNohup تسمح عملية العميل لا أن يقتل إذا قتل عملية الأصل، لحجة عند خروج. حتى أفضل من ذلك استخدام:

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

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

واستخدام الشاشة. وهو بسيط جدا لاستخدام ويعمل مثل فنك لمحطات. http://www.bangmoney.org/presentations/screen.html

إذا كنت على استعداد لتشغيل تطبيقات X كذلك - استخدام xpra جنبا إلى جنب مع "شاشة"

سأختار أيضًا برنامج الشاشة (أعلم أن إجابة شخص آخر كانت شاشة ولكن هذا إكمال)

ليس فقط حقيقة أن &، ctrl+z bg يتبرأ، وnohup، وما إلى ذلك.قد يعطيك مفاجأة سيئة أنه عندما تقوم بتسجيل الخروج، سيتم إيقاف الوظيفة (لا أعرف السبب، لكن هذا حدث لي، ولم يزعجني ذلك لأنني قمت بالتبديل لاستخدام الشاشة، ولكن أعتقد أن حل anthonyrisinger مزدوج التفرع من شأنه أن يحل ذلك)، كما تحتوي الشاشة على رئيسي ميزة على مجرد التأريض الخلفي:

screen will background your process without losing interactive control to it

وبالمناسبة، هذا سؤال لن أطرحه أبدًا في المقام الأول :) ...أستخدم الشاشة منذ بداية القيام بأي شيء في أي نظام يونكس ...أنا (تقريبًا) لا أعمل أبدًا في غلاف Unix/Linux دون بدء تشغيل الشاشة أولاً ...ويجب أن أتوقف الآن، أو سأبدأ عرضًا تقديميًا لا نهاية له حول ماهية الشاشة الجيدة وما يمكن أن تفعله لك...ابحث عنه بنفسك فهو يستحق ;)

وهناك أيضا الخفي قيادة حزمة libslack مفتوح المصدر.

وdaemon هو شكلي تماما ولا يهتمون جميع الأشياء الخفي مملة مثل إعادة التشغيل التلقائي، وقطع الأشجار أو معالجة pidfile.

وإلحاق هذه السلسلة إلى الأمر:> و- 2> & - <و- و. > و- يعني المعياري وثيق. 2> و- يعني ستدير وثيق. <و- يعني ستدين وثيق. ويعني تعمل في الخلفية. هذا يعمل لبدء مهمة عبر سه برمجيا، وأيضا:

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

واعتدت قيادة الشاشة. هذا المحور من التفاصيل عن كيفية القيام بذلك

https://www.rackaid.com / بلوق / لينكس شاشة البرنامج التعليمي، وكيف ل/ # بدءا

والإجابة مقبولة توحي باستخدام <م> nohup . أود أن أقترح بدلا باستخدام PM2 . باستخدام <م> PM2 على nohup لديه العديد من المزايا، مثل الحفاظ على تطبيق على قيد الحياة، والحفاظ على ملفات السجل من أجل تطبيق والكثير المزيد من الميزات الأخرى. لمزيد من التفاصيل التحقق من ذلك .

لتثبيت <م> PM2 تحتاج إلى تحميل <م> الآلية الوقائية الوطنية . لنظام قائم على ديبيان

sudo apt-get install npm

ووردهات

sudo yum install npm

وأو يمكنك اتباع هذه التعليمات . بعد تثبيت <م> الآلية الوقائية الوطنية استخدامه لتثبيت <م> PM2

npm install pm2@latest -g

وبمجرد القيام به في يمكنك البدء في تطبيق الخاص بك عن طريق

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

لاستخدام الرصد العملية التالية الأوامر:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

وإدارة العمليات باستخدام إما اسم أو عملية التطبيق معرف أو إدارة جميع العمليات معا:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

ويمكن الاطلاع على ملفات الدخول في

$HOME/.pm2/logs #contain all applications logs

يمكن أيضا تشغيل

والملفات القابلة للتنفيذ الثنائية باستخدام PM2. لقد لإجراء تغيير في ملف جايسون. تغيير "exec_interpreter" : "node"، ل"exec_interpreter" : "none". (انظر في سمات قسم ).

#include <stdio.h>
#include <unistd.h>  //No standard C library
int main(void)
{
    printf("Hello World\n");
    sleep (100);
    printf("Hello World\n");

    return 0;
}

وتجميع فوق كود

gcc -o hello hello.c  

ووتشغيله مع NP2 في الخلفية

pm2 start ./hello

في سيستم دي / لينكس، سيستم دي المدى عبارة أداة لطيفة لإطلاق عمليات مستقلة الدورة. كارهي ستعمل أكره

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