Gibt es eine Alternative für den Timeout-Befehl unter Mac OSx? Grundvoraussetzung ist, dass ich einen Befehl für eine bestimmte Zeit ausführen kann.
z.B:
timeout 10 ping google.com
Dieses Programm führt Ping für 10s unter Linux aus.
Gibt es eine Alternative für den Timeout-Befehl unter Mac OSx? Grundvoraussetzung ist, dass ich einen Befehl für eine bestimmte Zeit ausführen kann.
z.B:
timeout 10 ping google.com
Dieses Programm führt Ping für 10s unter Linux aus.
Antworten:
Sie können verwenden
brew install coreutils
Und wenn Sie eine Zeitüberschreitung benötigen, verwenden Sie
gtimeout
..stattdessen. Um zu erklären, warum hier ein Ausschnitt aus dem Abschnitt Homebrew Caveats:
Vorsichtsmaßnahmen
Alle Befehle wurden mit dem Präfix 'g' installiert.
Wenn Sie diese Befehle wirklich mit ihren normalen Namen verwenden müssen, können Sie Ihrem PATH aus Ihrem bashrc ein "gnubin" -Verzeichnis hinzufügen, wie:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"Darüber hinaus können Sie auf ihre Manpages mit normalen Namen zugreifen, wenn Sie das Verzeichnis "gnuman" auch von Ihrem bashrc zu Ihrem MANPATH hinzufügen:
MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutum nur den einen Befehl zu aktivieren (die Alias-Lösung funktioniert für die interaktive CLI-Verwendung, jedoch nicht, wenn sie aus Bash-Skripten aufgerufen wird).
brew install coreutilsund der timeoutBefehl war ohne Präfix verfügbar.
Ein anderer einfacher Ansatz, der ziemlich plattformübergreifend funktioniert (weil er Perl verwendet, das fast überall ist), ist folgender:
function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }
Von hier aus gefangen: https://gist.github.com/jaytaylor/6527607
Anstatt es in eine Funktion einzufügen, können Sie einfach die folgende Zeile in ein Skript einfügen, und es funktioniert auch:
perl -e 'alarm shift; exec @ARGV' "$@";
oder eine Version, die Hilfe / Beispiele eingebaut hat:
#!/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' "$@";
perl -e 'alarm shift; exec "ping google.com"?
Alarm clockNachricht, wenn der Timer abläuft, und das Beseitigen wird unübersichtlich .
function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Beachten Sie, dass Perl> = 5.8 gemäß perldoc.perl.org/functions/alarm.html erforderlich ist )
Mit diesem Befehl können Sie die Ausführungszeit jedes Programms begrenzen:
ping -t 10 google.com & sleep 5; kill $!
Das Timeout-Paket von Ubuntu / Debian kann auf einem Mac kompiliert werden und funktioniert. Das Paket ist unter http://packages.ubuntu.com/lucid/timeout verfügbar
brew install coreutils- Verwenden gtimeoutoder setzen Sie dann Ihren Pfad, um den timeoutNamen zu verwenden.
Du kannst tun ping -t 10 google.com >nul
das> nul wird die Ausgabe los. Anstatt also 64 BYTES VON 123.45.67.8 BLAH BLAH BLAH anzuzeigen, wird nur eine leere neue Zeile angezeigt, bis das Zeitlimit überschritten wird. Das Flag -t kann in eine beliebige Zahl geändert werden.