تفرخ عملية خلفية في روبي
-
22-09-2019 - |
سؤال
أنا أكتب نصًا مطبقًا للمشروع المدرسي ، وجزء من عملية bootstrapping هذه هو بدء تشغيل بضع عمليات خلفية (مكتوبة وتعمل بشكل صحيح). ما أود القيام به هو شيء على غرار:
`/path/to/daemon1 &`
`/path/to/daemon2 &`
`/path/to/daemon3 &`
ومع ذلك ، فإن هذا يحجب على المكالمة الأولى لتنفيذ Daemon1. لقد رأيت إشارات إلى أ Process.spawn
الطريقة ، ولكن يبدو أن هذه ميزة أكثر من 1.9 ، وأنا أقصر على Ruby 1.8.
لقد حاولت أيضًا تنفيذ هذه الشياطين من مؤشرات ترابط مختلفة ، لكنني أرغب في أن يتمكن نصي Bootstrap من الخروج.
فكيف يمكنني بدء عمليات الخلفية هذه بحيث لا يحظر البرنامج النصي الخاص بي bootstrap (ولكن لا يزال لديك الشياطين في الخلفية)؟
المحلول
طالما أنك تعمل على نظام التشغيل posix يمكنك استخدامه fork
و exec
.
fork
= إنشاء عملية فرعية
exec
= استبدال العملية الحالية بعملية أخرى
تحتاج بعد ذلك إلى إبلاغ أن عمليةك الرئيسية ليست مهتمة بالعمليات الفرعية التي تم إنشاؤها عبر Process.detach
.
job1 = fork do
exec "/path/to/daemon01"
end
Process.detach(job1)
...
نصائح أخرى
أفضل طريقة للاشتعال الزائفة:
`((/path/to/deamon1 &)&)`
سوف تسقط العملية في قذيفة خاصة بها.
أفضل طريقة لخدم في الواقع:
`service daemon1 start`
وتأكد من أن الخادم/المستخدم لديه إذن لبدء البرنامج الخفي الفعلي. تحقق من أداة "deamonize" لـ Linux لإعداد Deamon الخاص بك.