এখানে একটি প্রয়াস যা কোনও প্রক্রিয়া ইতিমধ্যে বের হয়ে যাওয়ার পরে হত্যা না করার চেষ্টা করে যা একই প্রক্রিয়া আইডি দিয়ে অন্য প্রক্রিয়াটি হত্যার সম্ভাবনা হ্রাস করে (যদিও এই ধরণের ত্রুটি সম্পূর্ণভাবে এড়ানো সম্ভব নয়)।
run_with_timeout ()
{
t=$1
shift
echo "running \"$*\" with timeout $t"
(
# first, run process in background
(exec sh -c "$*") &
pid=$!
echo $pid
# the timeout shell
(sleep $t ; echo timeout) &
waiter=$!
echo $waiter
# finally, allow process to end naturally
wait $pid
echo $?
) \
| (read pid
read waiter
if test $waiter != timeout ; then
read status
else
status=timeout
fi
# if we timed out, kill the process
if test $status = timeout ; then
kill $pid
exit 99
else
# if the program exited normally, kill the waiting shell
kill $waiter
exit $status
fi
)
}
এর মতো ব্যবহার করুন run_with_timeout 3 sleep 10000
যা চালায় sleep 10000
তবে এটি 3 সেকেন্ড পরে শেষ হয়।
এটি অন্যান্য উত্তরের মতো যা একটি বিলম্বের পরে শিশু প্রক্রিয়াটি হ'তে ব্যাকগ্রাউন্ড টাইমআউট প্রক্রিয়া ব্যবহার করে। আমি মনে করি এটি ড্যানের বর্ধিত উত্তর হিসাবে প্রায় একই ( https://stackoverflow.com/a/5161274/1351983 ), সময়সীমা শেল বাদে এটি ইতিমধ্যে শেষ হয়ে গেলে হত্যা করা হবে না।
এই প্রোগ্রামটি শেষ হওয়ার পরে, এখনও কয়েকটি দীর্ঘ "ঘুম" প্রক্রিয়া চলবে, তবে সেগুলি নিরীহ হওয়া উচিত।
এটি আমার অন্যান্য উত্তরের চেয়ে ভাল সমাধান হতে পারে কারণ এটি অ-বহনযোগ্য শেল বৈশিষ্ট্যটি read -t
ব্যবহার করে না এবং ব্যবহার করে না pgrep
।