সহ zsh, আপনি করতে পারেন:
zmodload zsh/system
coproc your-command
while :; do
sysread -t 10 -o 1 <&p && continue
if (( $? == 4 )); then
echo "Timeout" >&2
kill $!
fi
break
done
টাইমআউট সহ আউটপুট থেকে পড়ার -tবিকল্পটি ব্যবহার করার ধারণাটি ।sysreadyour-command
নোট করুন এটি your-commandএর পাইপকে পাইপ বানায় pipe এটি হতে পারে যে your-commandএটি যখন কোনও টার্মিনালে না যায় তখন তার আউটপুটটি বাফার শুরু করে, এক্ষেত্রে আপনি দেখতে পাবেন যে এটি কিছুক্ষণের মধ্যে আউটপুট দেয় না, তবে কেবল সেই বাফারিংয়ের কারণে নয়, কারণ এটি কোনওভাবে ঝুলিয়ে রাখা হয়েছে ।
আপনি stdbuf -oL your-commandলাইন-বাফারিং পুনরুদ্ধার করে (যদি আপনার কমান্ডটি স্টডিও ব্যবহার zptyকরে ) বা coprocটার্মিনাল আউটপুট জাল করার পরিবর্তে ব্যবহার করতে পারেন ।
সহ bash, আপনাকে যদি নির্ভর করে তবে ddজিএনইউতে নির্ভর করতে হবে timeout:
coproc your-command
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done
পরিবর্তে coproc, আপনি প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন:
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done 3< <(your-command)
(এটি এতে কাজ করে না zshবা ksh93কারণ সেখানে $!পিড থাকে না your-command)।