А затем, когда вам понадобится тайм-аут, используйте
gtimeout
..вместо. Чтобы объяснить, почему вот отрывок из раздела Homebrew Caveats:
Предостережения
Все команды устанавливаются с префиксом «g».
Если вам действительно нужно использовать эти команды с их обычными именами, вы можете добавить каталог «gnubin» в свой PATH из вашего bashrc, например:
Или ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutпросто включить одну команду (решение с псевдонимом работает для интерактивного использования CLI, но не при вызове из сценариев bash).
John Y
1
На моей стороне после установки coerutils у меня был тайм-аут, доступный как тайм-аут: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: Файл существует
talsibony
Обновление: я только что установил coreutils brew install coreutils, и timeoutкоманда была доступна без префикса.
tdensmore
24
Еще один простой подход, который работает в значительной степени кросс-платформенный (потому что он использует perl, который есть почти везде), заключается в следующем:
Вместо того, чтобы помещать его в функцию, вы можете просто вставить следующую строку в скрипт, и она тоже будет работать:
timeout.sh
perl -e 'alarm shift; exec @ARGV' "$@";
или версия со встроенной справкой / примерами:
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' "$@";
Как это выглядит, если использовать его напрямую, без использования функции?
mwfearnley 08
это в значительной степени просто удалить функцию и оставить строку perl ... Подробнее я изложил выше!
Брэд Паркс
Как это выглядит как однострочник одноразового использования? Что-то вроде perl -e 'alarm shift; exec "ping google.com"?
mwfearnley 08
К сожалению, это генерирует Alarm clockсообщение, когда таймер истекает, и устранение этого становится беспорядочным .
RichVel
1
Было бы неплохо добавить версию ualarm, когда вам нужна большая точность: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Обратите внимание, что для этого требуется Perl> = 5.8 в соответствии с perldoc.perl.org/functions/alarm.html )
gib
6
Вы можете ограничить время выполнения любой программы с помощью этой команды:
Вероятно, это не то, что вам нужно. В результате команда будет выполняться ровно 5 секунд. Это означает, что если вы хотите, чтобы это было максимальное время, но не минимальное, это не то, что вы ищете
Более простой способ - использовать Homebrew: brew install coreutils- затем используйте gtimeoutили установите PATH для использования timeoutимени.
RichVel
1
Ты можешь сделать ping -t 10 google.com >nul
> nul избавляется от вывода. Таким образом, вместо того, чтобы показывать 64 БАЙТА ОТ 123.45.67.8 BLAH BLAH BLAH, он будет просто показывать пустую новую строку, пока не истечет время ожидания. -t флаг можно изменить на любое число.
Ответы:
Ты можешь использовать
А затем, когда вам понадобится тайм-аут, используйте
..вместо. Чтобы объяснить, почему вот отрывок из раздела Homebrew Caveats:
источник
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
просто включить одну команду (решение с псевдонимом работает для интерактивного использования CLI, но не при вызове из сценариев bash).brew install coreutils
, иtimeout
команда была доступна без префикса.Еще один простой подход, который работает в значительной степени кросс-платформенный (потому что он использует perl, который есть почти везде), заключается в следующем:
Выловлено отсюда: https://gist.github.com/jaytaylor/6527607
Вместо того, чтобы помещать его в функцию, вы можете просто вставить следующую строку в скрипт, и она тоже будет работать:
timeout.sh
или версия со встроенной справкой / примерами:
timeout.sh
источник
perl -e 'alarm shift; exec "ping google.com"
?Alarm clock
сообщение, когда таймер истекает, и устранение этого становится беспорядочным .function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; }
(Обратите внимание, что для этого требуется Perl> = 5.8 в соответствии с perldoc.perl.org/functions/alarm.html )Вы можете ограничить время выполнения любой программы с помощью этой команды:
источник
Пакет Timeout из Ubuntu / Debian может быть скомпилирован на Mac, и он работает. Пакет доступен по адресу http://packages.ubuntu.com/lucid/timeout.
источник
brew install coreutils
- затем используйтеgtimeout
или установите PATH для использованияtimeout
имени.Ты можешь сделать
ping -t 10 google.com >nul
> nul избавляется от вывода. Таким образом, вместо того, чтобы показывать 64 БАЙТА ОТ 123.45.67.8 BLAH BLAH BLAH, он будет просто показывать пустую новую строку, пока не истечет время ожидания. -t флаг можно изменить на любое число.
источник