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:
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:
Oder 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).
John Y
1
Auf meiner Seite habe ich nach der Installation von coerutils eine Zeitüberschreitung als Zeitüberschreitung erhalten: ln -s / usr / local / bin / gtimeout / usr / lokal / bin / timeout ln: / usr / local / bin /
timeout
Update: Ich habe gerade coreutils mit installiert brew install coreutilsund der timeoutBefehl war ohne Präfix verfügbar.
Tdensmore
25
Ein anderer einfacher Ansatz, der ziemlich plattformübergreifend funktioniert (weil er Perl verwendet, das fast überall ist), ist folgender:
Anstatt es in eine Funktion einzufügen, können Sie einfach die folgende Zeile in ein Skript einfügen, und es funktioniert auch:
timeout.sh
perl -e 'alarm shift; exec @ARGV' "$@";
oder eine Version, die Hilfe / Beispiele eingebaut hat:
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' "$@";
Wie sieht es aus, es direkt zu verwenden, ohne es in eine Funktion zu verpacken?
mwfearnley
Es ist so ziemlich einfach, die Funktion zu entfernen und die Perl-Zeile zu verlassen ... Ich habe oben mehr Details eingefügt!
Brad Parks
Wie sieht es als Einweg-Einzeiler aus? So etwas wie perl -e 'alarm shift; exec "ping google.com"?
mwfearnley
Leider erzeugt dies eine Alarm clockNachricht, wenn der Timer abläuft, und das Beseitigen wird unübersichtlich .
RichVel
1
Es wäre gut, die ualarm-Version hinzuzufügen, wenn Sie mehr Präzision benötigen: 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 )
gib
6
Mit diesem Befehl können Sie die Ausführungszeit jedes Programms begrenzen:
Dies ist wahrscheinlich nicht das, was Sie wollen. Das Ergebnis ist, dass der Befehl genau 5 Sekunden ausgeführt wird. Das heißt, wenn Sie möchten, dass es eine maximale Zeit ist, aber nicht auch die
minimale, dann
2
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
Eine einfachere Möglichkeit ist die Verwendung von Homebrew: brew install coreutils- Verwenden gtimeoutoder setzen Sie dann Ihren Pfad, um den timeoutNamen zu verwenden.
RichVel
1
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.
Antworten:
Sie können verwenden
Und wenn Sie eine Zeitüberschreitung benötigen, verwenden Sie
..stattdessen. Um zu erklären, warum hier ein Ausschnitt aus dem Abschnitt Homebrew Caveats:
quelle
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 dertimeout
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:
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:
timeout.sh
oder eine Version, die Hilfe / Beispiele eingebaut hat:
timeout.sh
quelle
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:
quelle
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
quelle
brew install coreutils
- Verwendengtimeout
oder setzen Sie dann Ihren Pfad, um dentimeout
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.
quelle