سؤال

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

أساسا، أريد "عملية رئيسية".

إليك ما حصلت عليه حتى الآن:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait

فشل البرنامج النصي أعلاه trap: 10: SIGTERM: bad trap.

تحرير: أنا أستخدم Ubuntu 9.04

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

المحلول 2

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

البرنامج النصي النهائي يشبه هذا:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait

نصائح أخرى

هذا يعمل بالنسبة لي:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$ يرسل أ Sigterm. إلى مجموعة العملية بأكملها، وبالتالي قتل أيضا أحفاد.

  • تحديد إشارة EXIT مفيد عند استخدام set -e (المزيد من التفاصيل هنا).

أظن أن bin / sh ليس باش (على الرغم من أنك تحمل علامة المسألة باسم "باش").

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

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

كيف ترسل إشارة Sigterm إلى "العملية الرئيسية"؟ ربما يجب أن تنفذ kill -l للتحقق من الإشارات التي يتم دعمها. نظرا لأن رسالة الخطأ تقترح عليك إرسال إشارة "10" والتي لا يبدو أن نظامك يتعرف عليه.

وفي المرة القادمة يجب عليك إضافة نظام التشغيل، إصدار Shell، Kernel، ... لمثل هذا السؤال

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