Команда времени ожидания в Mac OS X? - PullRequest
61 голосов
/ 17 августа 2010

Есть ли альтернатива команде timeout в Mac OSx. Основное требование - я могу выполнить команду в течение указанного промежутка времени.

например:

timeout 10 ping google.com

Эта программа запускает ping в течение 10 секунд в Linux.

Ответы [ 5 ]

105 голосов
/ 14 января 2014

Вы можете использовать

brew install coreutils

А затем, когда вам нужно время ожидания, используйте

gtimeout

.. вместо этого. Чтобы объяснить, почему вот фрагмент из раздела Homebrew Caveats:

Предостережения

Все команды были установлены с префиксом «g».

Если вам действительно нужно использовать эти команды с их обычными именами, вы Вы можете добавить каталог "gnubin" в ваш путь из вашего bashrc, например:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Кроме того, вы можете получить доступ к их справочным страницам с обычными именами, если добавите каталог "gnuman" для вашей MANPATH также из вашего bashrc:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
17 голосов
/ 19 февраля 2016

Другой простой подход, который работает в значительной степени кросс-платформенный (потому что он использует Perl, который почти везде), это:

function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

Подцепил отсюда: https://gist.github.com/jaytaylor/6527607

Вместо того, чтобы помещать это в функцию, вы можете просто вставить следующую строку в скрипт, и это тоже будет работать:

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: /496571/komanda-komandnoi-stroki-dlya-avtomaticheskogo-unichtozheniya-komandy-cherez-opredelennoe-vremya
# 
perl -e 'alarm shift; exec @ARGV' "$@";
7 голосов
/ 01 августа 2014

Вы можете ограничить время выполнения любой программы, используя эту команду:

ping -t 10 google.com & sleep 5; kill $!
2 голосов
/ 22 сентября 2010

Пакет Timeout из Ubuntu / Debian можно скомпилировать на Mac, и он работает.Пакет доступен на http://packages.ubuntu.com/lucid/timeout

1 голос
/ 17 августа 2010

Вы можете сделать ping -t 10 google.com >nul

,> nul избавится от вывода.Таким образом, вместо того, чтобы показывать 64 БАЙТА ИЗ 123.45.67.8 БЛА БЛА БЛА БЛА, он будет просто показывать пустой символ новой строки до истечения времени ожидания.Флаг -t можно изменить на любое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...