एक प्रक्रिया को मार डालो अगर यह निश्चित समय के लिए शांत हो जाता है


9

मेरे पास एक उपयोगिता है जो चुप रहने और वहां रहने की एक बुरा आदत है, मुझे पहले से ही पता है कि यह प्रक्रिया में कितना समय लगता है इसलिए मैं timeoutइस से लड़ने के लिए उपयोग कर रहा हूं , लेकिन कभी-कभी यह उस समय से पहले करता है। क्या इसके समान एक उपकरण है timeoutजो प्रक्रिया को मार देगा अगर यह स्टडआउट को निर्देशन आउटपुट रोक देता है?

जवाबों:


8

के साथ 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)।


1
नमस्ते! धन्यवाद, क्या यह संभव है कि आप यह टिप्पणी कर सकें इसलिए मैं समझ सकता हूं कि यह क्या कर रहा है?
बेंजो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.