আপনার 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