سؤال

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

وتمكنت من القيام ما يلزم من شفط بعض رمز من البرمجة روبي الكتاب، ولكن أود أن تجد أفضل طريقة / يمين، وفهم ما يجري. وهنا ما حصلت عليه في البداية:

exec("whatever --take-very-long") if fork.nil?
Process.detach($$)

و

<ديل> وهكذا، وهذا هو الطريق، أو وإلا كيف أفعل ذلك؟

بعد التحقق من الإجابات أدناه انتهى بي الأمر مع هذا الرمز، والذي يبدو أكثر منطقية:

(pid = fork) ? Process.detach(pid) : exec("foo")

و

وسأكون ممتنا بعض التفسير على كيف يعمل fork. [حصل ذلك بالفعل]

وكان فصل الحق $$؟ أنا لا أعرف لماذا هذا يعمل، وأنا أحب حقا أن يكون فهم أفضل للوضع.

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

المحلول

وظيفة fork تفصل عملية الخاص في البلدين.

ثم يحصل كل من العمليات نتيجة الدالة. يتلقى الطفل قيمة صفر / nil (وبالتالي يعرف أنه هو الطفل) والوالد يتلقى PID للطفل.

وبالتالي:

exec("something") if fork.nil?

وسيجعل عملية طفل بداية "شيء ما"، وسوف عملية الأصل تحمل على مع ما كان عليه.

لاحظ أن exec() <م> يستبدل العملية الحالية مع "شيء ما"، وبالتالي فإن عملية طفل سيتم تنفيذ أبدا أي رمز روبي لاحقا.

والدعوة إلى Process.detach() تبدو وكأنها قد تكون غير صحيحة. كنت أتوقع أن يكون لديها PID الطفل في ذلك، ولكن إذا قرأت حق التعليمات البرمجية انها في الواقع فصل عملية الأصل.

نصائح أخرى

وAlnitak هو الصحيح. وإليك طريقة أكثر وضوحا لأنه يكتب، دون $$

pid = Process.fork
if pid.nil? then
  # In child
  exec "whatever --take-very-long"
else
  # In parent
  Process.detach(pid)
end

والغرض من فصل هو فقط أن أقول، "لا يهمني عندما ينهي الطفل" لتجنب غيبوبة عمليات .

وكان فك $$ ليس صحيحا. من ص. 348 من الفأس (إد 2ND):

<اقتباس فقرة>   

و$$ Fixnum عدد العملية للبرنامج يتم تنفيذه. [ص / س]

وهذا المقطع أو "المتغيرات والثوابت" في الفصل "روبي اللغة"، هو مفيد جدا من أجل فك رموز مختلف روبي الثوابت باختصار $ - ولكن في موقعها على الانترنت (الأولى

وهكذا ما كنت تفعل في الواقع تم فصل البرنامج من نفسه، وليس من طفل لها. كما قال آخرون، الطريقة الصحيحة لفصل من الطفل هو استخدام عاد معرف المنتج الطفل من fork().

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

fork do
    exec('whatever --option-flag')
end

وتوفير كتلة يقول شوكة لتنفيذ تلك الكتلة (وفقط تلك الكتلة) في عملية طفل، مع الاستمرار على في الأصل.

ولقد وجدت إجابات فوق كسر محطة بلدي وافسدت الإخراج. هذا هو الحل وجدت.

   system("nohup ./test.sh &")

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

#!/usr/bin/expect -f
spawn ssh host -l admin -i cloudkey  
expect "pass"
send "superpass\r"
sleep 1000000
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top