كيف يمكنني الحصول على عملية لإعادة تحميل نفسها في لينكس؟

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

سؤال

ولدي خدمة، ويقول فو، وكتب في C ++، الذي يعمل على الجذر. هناك السهم المعتاد، /etc/init.d/foo تشغيل | توقف |. إعادة تشغيل

وفي أوقات معينة، يحتاج فو لتحديث نفسها. عادة بعد انتهاء ترقية. لكن الأمور تفعل مثل:

system("/etc/init.d/foo restart")

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

هل هناك مكالمة أخرى يمكنني استخدامها بدلا من نظام () التي تدير بشكل غير متزامن كما أخ لعملية الاستدعاء، بدلا من إنشاء طفل متزامن؟

وشكرا!

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

المحلول

هل تعتبر الأسرة exec[*] حتى الآن؟ هنا واحد - execve

نصائح أخرى

هل يمكن وضعه في inittab و أضف ترك الحرف الأول تقلق بشأن استئناف العملية عند خروجها لأي سبب من الأسباب. ومن شأن ذلك أن أيضا أن تأخذ الرعاية من تشغيل التلقائي إذا حصلت عملية لتعطل أو تأكيد () أو الخروج بشكل غير متوقع.

وبعد ذلك، للتعامل مع حالة استخدامك، عملية ببساطة إنهاء نفسها.

وماذا عن شوكة ()، يليه إكسيك ()؟

والنظر في تنفيذ

/etc/init.d/foo reload

ولالخفي الخاص (التحكيم إلى حد قياسي من قبل البقرى من بلدي مربع ديبيان).

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

إذا عملية تعرف أنه يحتاج لإعادة تحميل أنها يمكن أن مجرد إشارة نفسها.

إذا كنت حقا لا تحتاج إلى إعادة تشغيل لالتقاط مكتبات جديدة ثم انتقل مع exec*()

والجمع بين الجوابين حتى الآن، استخدم -شوكة إكسيك .

لإضافة إلى ما أوري قال بالفعل، لا يزال بعض توزيعات لينكس استخدام initab، ولكن أوبونتو وربما آخرين تحولوا إلى /etc/event.d. كنت وضعت ملف في وجود (نسخ وتعديل واحد من تلك القائمة) ثم قم بتشغيل البرنامج الخفي مع "سودو بدء ssh_tunnel" أو ما يسمى الملف.

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

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

ولكن ننظر أيضا في inittab و أضف event.d اعتمادا على توزيعة الخاصة بك، لمعرفة ما اذا كان سوف تفعل ما تريد بطريقة أفضل.

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

http://cr.yp.to/daemontools.html

ونظرة على الصفحة رجل لinittab.

ويصف التقرير كيف يمكن لنظام لصناعة السيارات إعادة تشغيل العمليات الخاصة بك إذا ماتت (بيضة).

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

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