के साथ 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
एक पाइप का आउटपुट बनाता है । ऐसा हो सकता है कि 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
)।