मैक ओएस एक्स पर टाइमआउट कमांड?


95

क्या मैक ओएसएक्स पर टाइमआउट कमांड के लिए कोई विकल्प है। मूल आवश्यकता यह है कि मैं एक निर्दिष्ट समय के लिए एक कमांड चलाने में सक्षम हूं।

उदाहरण के लिए:

timeout 10 ping google.com

यह प्रोग्राम लिनक्स पर 10s के लिए पिंग चलाता है।


जवाबों:


139

आप उपयोग कर सकते हैं

brew install coreutils

और फिर जब भी आपको टाइमआउट की जरूरत हो, उपयोग करें

gtimeout

..बजाय। यह समझाने के लिए कि होमब्रेव कैविट्स अनुभाग से एक स्निपेट क्यों:

चेतावनियां

सभी कमांड उपसर्ग 'जी' के साथ स्थापित किए गए हैं।

यदि आपको वास्तव में इन आदेशों को उनके सामान्य नामों के साथ उपयोग करने की आवश्यकता है, तो आप अपने bashrc से अपने PATH में "gnubin" निर्देशिका जोड़ सकते हैं:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

इसके अतिरिक्त, यदि आप अपने मैनपाट में "gnuman" निर्देशिका को अपने bashrc से भी जोड़ते हैं, तो आप उनके मैन पेजों को सामान्य नामों से एक्सेस कर सकते हैं:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

22
तब: उर्फ ​​टाइमआउट = gtimeout
nadadwa

1
या ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutसिर्फ एक कमांड को सक्षम करने के लिए (उर्फ समाधान इंटरेक्टिव सीएलआई उपयोग के लिए काम करता है, लेकिन बैश स्क्रिप्ट से नहीं बुलाया जाता है)।
जॉन वाई

1
मेरी ओर से स्थापित कॉरुटिल्स के बाद मुझे टाइम आउट के रूप में समय-समय पर उपलब्ध हो गया: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / लोकल / बिन / टाइमआउट: फाइल मौजूद है
talsibony

1
अद्यतन: मैंने सिर्फ कोर्यूटिल्स का उपयोग करके स्थापित किया है brew install coreutils, और timeoutकमांड उपसर्ग के बिना उपलब्ध था।
tdensmore

25

एक और सरल दृष्टिकोण जो बहुत अधिक पार मंच काम करता है (क्योंकि यह पर्ल का उपयोग करता है जो लगभग हर जगह है) यह है:

function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

यहां से स्नैग्ड: https://gist.github.com/jaytaylor/6527607

इसे एक फंक्शन में रखने के बजाय, आप बस एक स्क्रिप्ट में निम्नलिखित लाइन डाल सकते हैं, और यह भी काम करेगा:

timeout.sh

perl -e 'alarm shift; exec @ARGV' "$@";

या एक संस्करण जो मदद / उदाहरणों में बनाया गया है:

timeout.sh

#!/usr/bin/env bash

function show_help()
{
  IT=$(cat <<EOF

Runs a command, and times out if it doesnt complete in time

Example usage:
 
   # Will fail after 1 second, and shows non zero exit code result
   $ timeout 1 "sleep 2" 2> /dev/null ; echo \$?
   142

   # Will succeed, and return exit code of 0.
   $ timeout 1 sleep 0.5; echo \$?
   0

   $ timeout 1 bash -c 'echo "hi" && sleep 2 && echo "bye"' 2> /dev/null; echo \$?
   hi
   142

   $ timeout 3 bash -c 'echo "hi" && sleep 2 && echo "bye"' 2> /dev/null; echo \$?
   hi
   bye
   0
EOF
)
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

#
# Mac OS-X does not come with the delightfully useful `timeout` program.  Thankfully a rough BASH equivalent can be achieved with only 2 perl statements.
#
# Originally found on SO: http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-after-a-certain-amount-of-time
# 
perl -e 'alarm shift; exec @ARGV' "$@";

किसी फ़ंक्शन में इसे लपेटे बिना इसे सीधे उपयोग करना कैसा दिखता है?
mwfearnley

यह बहुत अधिक है बस समारोह को हटा दें और पर्ल लाइन को छोड़ दें ... मैंने ऊपर अधिक विवरण डाला!
ब्रैड पार्क्स

यह एकल-उपयोग वाले वन-लाइनर के रूप में क्या दिखता है? कुछ पसंद है perl -e 'alarm shift; exec "ping google.com"?
mwfearnley

दुर्भाग्य से यह एक Alarm clockसंदेश उत्पन्न करता है जब टाइमर समाप्त हो जाता है , और इसे समाप्त करने से गड़बड़ हो जाती है
रिचवेल

1
जब आपको अधिक सटीकता की आवश्यकता हो तो ualarm संस्करण जोड़ना अच्छा होगा: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (ध्यान दें कि इसके लिए Perl> = 5.8 की आवश्यकता होती है perldoc.perl.org/functions/alarm.html के अनुसार )
gib

7

आप इस आदेश का उपयोग करके किसी भी कार्यक्रम के निष्पादन समय को सीमित कर सकते हैं:

ping -t 10 google.com & sleep 5; kill $!

9
यह शायद वह नहीं है जो आप चाहते हैं। परिणाम यह है कि कमांड ठीक 5 सेकंड चलेगा। मतलब, यदि आप चाहते हैं कि यह अधिकतम समय हो, लेकिन यह भी नहीं कि यह वह नहीं है
जिसकी

2

उबंटू / डेबियन से टाइमआउट पैकेज मैक पर संकलित करने के लिए बनाया जा सकता है और यह काम करता है। पैकेज http://packages.ubuntu.com/lucid/timeout पर उपलब्ध है


2
होमब्रे का उपयोग करने का एक आसान तरीका है: brew install coreutils- फिर नाम gtimeoutका उपयोग करने के लिए अपने पैट का उपयोग करें या सेट करें timeout
रिचवेल

1

तुम कर सकते हो ping -t 10 google.com >nul

> nul को आउटपुट से छुटकारा मिलता है। इसलिए 123.45.67.8 BLAH BLAH BLAH से 64 BYTES दिखाने के बजाय यह केवल एक खाली नई पंक्ति दिखाएगा, जब तक कि यह समय समाप्त न हो जाए। -t झंडा किसी भी संख्या में बदला जा सकता है।


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