के साथ 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एक पाइप का आउटपुट बनाता है । ऐसा हो सकता है कि your-commandटर्मिनल में जाने पर इसका आउटपुट बफ़र करना शुरू न कर दे, इस स्थिति में आप पा सकते हैं कि यह कुछ समय में कुछ भी आउटपुट नहीं करता है, लेकिन केवल उस बफरिंग के कारण, इसलिए नहीं कि यह किसी तरह लटका हुआ है ।
आप stdbuf -oL your-commandलाइन-बफरिंग (यदि आपकी कमांड stdio का उपयोग करता है) को पुनर्स्थापित करने के लिए या टर्मिनल आउटपुट को नकली करने के zptyबजाय उपयोग करके इसके चारों ओर काम कर सकते हैं coproc।
उपलब्ध होने पर bash, आपको ddऔर GNU पर निर्भर रहना 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)।