সহ 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
বিকল্পটি ব্যবহার করার ধারণাটি ।sysread
your-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
)।