আপনার killআদেশ পিছন দিকে।
অনেক ইউনিক্স কমান্ডের মতো, অন্যান্য যুক্তির আগে, বিয়োগ দিয়ে শুরু হওয়া বিকল্পগুলি অবশ্যই আগে আসবে।
যদি লিখি
kill -INT 0
এটি -INTবিকল্প হিসাবে দেখে এবং প্রেরণ SIGINTকরে 0( 0বর্তমান প্রক্রিয়া গোষ্ঠীর সমস্ত প্রক্রিয়াগুলির অর্থ একটি বিশেষ সংখ্যা)।
তবে লিখলে
kill 0 -INT
এটি দেখে 0, সিদ্ধান্ত নেয় যে আর কোনও বিকল্প নেই, তাই SIGTERMডিফল্টরূপে ব্যবহার করে। এবং এটি বর্তমান প্রক্রিয়া গোষ্ঠীতে প্রেরণ করে , যেমনটি আপনি করেছেন
kill -TERM 0 -INT
(এটা এছাড়াও পাঠানোর চেষ্টা করবে SIGTERMকরার -INT, যা একটি বাক্য গঠন ত্রুটি কারণ হবে, কিন্তু এটা পাঠায় SIGTERMকরার 0প্রথম, এবং পায় না যে পর্যন্ত।)
সুতরাং আপনার প্রধান স্ক্রিপ্ট একটি হচ্ছে SIGTERMআগে এটি চালানোর জন্য পায় waitএবং echo DONE।
যোগ
trap 'echo got SIGTERM' TERM
শীর্ষে, ঠিক পরে
trap 'killall' INT
এবং এটি প্রমাণ করতে এটি আবার চালান।
স্টিফেন চেজেলাস যেমন উল্লেখ করেছেন, আপনার পটভূমি শিশুরা ( process1ইত্যাদি) SIGINTডিফল্টরূপে উপেক্ষা করবে ।
যাই হোক না কেন, আমি মনে করি পাঠানো SIGTERMআরও অর্থবোধ করবে।
অবশেষে, আমি নিশ্চিত না যে kill -process groupপ্রথমে বাচ্চাদের কাছে যাওয়ার গ্যারান্টিযুক্ত কিনা । শাট ডাউন করার সময় সিগন্যালগুলি উপেক্ষা করা ভাল ধারণা হতে পারে।
সুতরাং এটি চেষ্টা করুন:
#!/bin/bash
trap 'killall' INT
killall() {
trap '' INT TERM # ignore INT and TERM while shutting down
echo "**** Shutting down... ****" # added double quotes
kill -TERM 0 # fixed order, send TERM not INT
wait
echo DONE
}
./process1 &
./process2 &
./process3 &
cat # wait forever