Polecenie przekroczenia limitu czasu w systemie Mac OS X?

90

Czy istnieje alternatywa dla polecenia limitu czasu w systemie Mac OSx? Podstawowym wymaganiem jest to, że mogę uruchomić polecenie przez określony czas.

na przykład:

timeout 10 ping google.com

Ten program uruchamia ping przez 10 sekund w systemie Linux.

sheki
źródło
Zobacz także unix.stackexchange.com/questions/43340/…
Joshua Goldberg

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"
kvz
źródło
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' "$@";
Brad Parks
źródło
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 $!
deadmoto
źródło
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
2

Pakiet Timeout z Ubuntu / Debian można skompilować na Macu i działa. Pakiet jest dostępny pod adresem http://packages.ubuntu.com/lucid/timeout

sheki
źródło
2
Łatwiejszym sposobem jest użycie Homebrew: brew install coreutils- następnie użyj gtimeoutlub ustaw PATH, aby używać timeoutnazwy.
RichVel
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ę.

redCube
źródło
2
Ping był naprawdę próbką. Chcę uruchomić program do zbierania danych
sheki,