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/timeout
um 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 coreutils
und der timeout
Befehl 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 clock
Nachricht, 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 gtimeout
oder setzen Sie dann Ihren Pfad, um den timeout
Namen 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.