Mac OS X'te zaman aşımı komutu?


Yanıtlar:


139

Kullanabilirsiniz

brew install coreutils

Ve sonra zaman aşımına ihtiyaç duyduğunuzda

gtimeout

..yerine. Neden Homebrew Uyarıları bölümünden bir pasaj olduğunu açıklamak için:

Uyarılar

Tüm komutlar 'g' önekiyle kuruldu.

Bu komutları normal isimleriyle gerçekten kullanmanız gerekiyorsa, bashrc'nizden PATH'inize bir "gnubin" dizini ekleyebilirsiniz:

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

Ayrıca, "gnuman" dizinini bashrc'nizden MANPATH'ınıza eklerseniz, normal adlarla man sayfalarına erişebilirsiniz:

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

22
Sonra: takma ad zaman aşımı = gtimeout
nkadwa

1
Veya ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutyalnızca bir komutu etkinleştirmek için (diğer ad çözümü etkileşimli CLI kullanımı için çalışır, ancak bash komut dosyalarından çağrıldığında çalışmaz).
John Y

1
Yüklü coerutils'ten sonra benim tarafımda zaman aşımı olarak kullanılabilir zaman aşımı var: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: Dosya var
talsibony

1
Güncelleme: Coreutils'i kullanarak yeni yükledim brew install coreutilsve timeoutkomut önek olmadan kullanılabilirdi.
tdensmore

25

Hemen hemen çapraz platformda çalışan başka bir basit yaklaşım (çünkü neredeyse her yerde perl kullanıyor) şudur:

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

Buradan takıldı: https://gist.github.com/jaytaylor/6527607

Bir fonksiyona koymak yerine, aşağıdaki satırı bir komut dosyasına koyabilirsiniz ve o da çalışacaktır:

timeout.sh

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

veya yerleşik yardım / örnekler içeren bir sürüm:

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' "$@";

Onu bir işleve sarmadan doğrudan kullanmak nasıl görünüyor?
mwfearnley

hemen hemen sadece işlevi kaldırıp perl satırını terk ediyor ... Yukarıya daha fazla ayrıntı koydum!
Brad Parks

Tek kullanımlık tek astar olarak neye benziyor? Gibi bir şey perl -e 'alarm shift; exec "ping google.com"?
mwfearnley

Maalesef bu Alarm clock, zamanlayıcının süresi dolduğunda bir mesaj oluşturur ve bunu ortadan kaldırmak karmaşıklaşır .
RichVel

1
Daha fazla hassasiyete ihtiyacınız olduğunda ualarm sürümünü eklemek iyi olur: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } ( Perldoc.perl.org/functions/alarm.html'ye göre Perl> = 5.8 gerektirdiğini unutmayın )
gib

7

Bu komutu kullanarak herhangi bir programın çalışma süresini sınırlayabilirsiniz:

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

9
Muhtemelen istediğin bu değil. Sonuç, komutun tam olarak 5 saniye çalışacağıdır. Yani, maksimum süre olmasını istiyorsanız, ancak aynı zamanda minimum değil, aradığınız şey bu değil
gesell


1

Yapabilirsin ping -t 10 google.com >nul

nul çıktıdan kurtulur. Bu nedenle, 123.45.67.8 BLAH BLAH BLAH DAN 64 BYT göstermek yerine, zaman aşımına uğrayana kadar boş bir satırsonu gösterecektir. -t bayrağı herhangi bir sayıya değiştirilebilir.


2
Ping gerçekten bir örnekti. Bazı ölçümleri toplamak için bir program çalıştırmak istiyorum
sheki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.