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.