Polecenie przekroczenia limitu czasu w systemie Mac OS X?


Odpowiedzi:


134

Możesz użyć

brew install coreutils

A potem, gdy potrzebujesz limitu czasu, użyj

gtimeout

..zamiast. Aby wyjaśnić, dlaczego oto fragment z sekcji Ostrzeżenia Homebrew:

Ostrzeżenia

Wszystkie polecenia zostały zainstalowane z przedrostkiem „g”.

Jeśli naprawdę potrzebujesz używać tych poleceń z ich normalnymi nazwami, możesz dodać katalog „gnubin” do swojej PATH z poziomu bashrc, na przykład:

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

Dodatkowo możesz uzyskać dostęp do ich stron podręcznika przy użyciu normalnych nazw, jeśli dodasz katalog "gnuman" do swojej MANPATH z poziomu bashrc:

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

21
Następnie: alias timeout = gtimeout
nkadwa

1
Lub ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutpo prostu włączyć jedno polecenie (rozwiązanie aliasu działa do interaktywnego użycia CLI, ale nie gdy jest wywoływane ze skryptów bash).
John Y

1
Po mojej stronie po zainstalowaniu coerutils mam limit czasu dostępny jako limit czasu: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: Plik istnieje
talsibony

Aktualizacja: właśnie zainstalowałem coreutils przy użyciu brew install coreutils, a timeoutpolecenie było dostępne bez prefiksu.
tdensmore

24

Innym prostym podejściem, które działa prawie na wielu platformach (ponieważ używa perla, który jest prawie wszędzie), jest to:

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

Zaczepiony stąd: https://gist.github.com/jaytaylor/6527607

Zamiast umieszczać go w funkcji, możesz po prostu umieścić następujący wiersz w skrypcie i też zadziała:

timeout.sh

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

lub wersja z wbudowaną pomocą / przykładami:

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

Jak wygląda użycie go bezpośrednio, bez zawijania go w funkcję?
mwfearnley

po prostu usuń funkcję i zostaw linię perl ... więcej szczegółów umieściłem powyżej!
Brad Parks

Jak to wygląda jako jednorazowa wkładka jednoliniowa? Coś jak perl -e 'alarm shift; exec "ping google.com"?
mwfearnley

Niestety, generuje to Alarm clockkomunikat, gdy licznik czasu się kończy, a wyeliminowanie tego staje się bałaganiarskie .
RichVel

1
Dobrze byłoby dodać wersję ualarm, gdy potrzebujesz większej precyzji: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Zauważ, że wymaga Perl> = 5.8 zgodnie z perldoc.perl.org/functions/alarm.html )
gib

6

Możesz ograniczyć czas wykonywania dowolnego programu za pomocą tego polecenia:

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

9
Prawdopodobnie nie tego chcesz. W rezultacie polecenie będzie działać dokładnie 5 sekund. Oznacza to, że jeśli chcesz, aby był to czas maksymalny, ale nie również min, to nie jest to, czego szukasz
gesell


1

Możesz to zrobić ping -t 10 google.com >nul

> nul pozbywa się wyniku. Więc zamiast pokazywać 64 bajty FROM 123.45.67.8 BLAH BLAH BLAH pokaże po prostu pustą nową linię, dopóki nie upłynie limit czasu. -t flagę można zmienić na dowolną liczbę.


2
Ping był naprawdę próbką. Chcę uruchomić program do zbierania danych
sheki,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.