Тайм-аут команды в Mac OS X?

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

например:

timeout 10 ping google.com

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

Ответ 1

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

brew install coreutils

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

gtimeout

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

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

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

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

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

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

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Ответ 2

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

function timeout() { perl -e 'alarm shift; exec @ARGV' "[email protected]"; }

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

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

timeout.sh

perl -e 'alarm shift; exec @ARGV' "[email protected]";

или версия со встроенной справкой/примерами:

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' "[email protected]";

Ответ 3

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

ping -t 10 google.com & sleep 5; kill $!

Ответ 4

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

Ответ 5

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

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