Команда тайм-ауту в Mac OS X?


90

Чи існує альтернатива команді таймауту на Mac OSx. Основна вимога - я можу виконувати команду протягом певного періоду часу.

наприклад:

timeout 10 ping google.com

Ця програма запускає ping протягом 10 секунд на Linux.


Відповіді:


134

Можна використовувати

brew install coreutils

А потім, коли вам потрібен тайм-аут, використовуйте

gtimeout

..замість цього. Щоб пояснити, чому ось фрагмент із розділу Homebrew Caveats:

Застереження

Усі команди були встановлені з префіксом "g".

Якщо вам дійсно потрібно використовувати ці команди з їх звичайними іменами, ви можете додати каталог "gnubin" до вашого PATH з вашого bashrc, наприклад:

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

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

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

22
Потім: псевдонім timeout = gtimeout
nkadwa

1
Або ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutпросто увімкнути одну команду (псевдонім працює для інтерактивного використання CLI, але не при виклику із скриптів bash).
Джон Й

1
На моєму боці після встановлених коерутилів я отримав тайм-аут, доступний як тайм-аут: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: Файл існує
talsibony

Оновлення: Я щойно встановив coreutils за допомогою brew install coreutils, і timeoutкоманда була доступна без префікса.
tdensmore

24

Ще одним простим підходом, який працює майже на всіх платформах (оскільки він використовує 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: 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

це майже просто видалити функцію і залишити рядок perl ... Я доклав більше деталей вище!
Бред Паркс,

Як це виглядає як одноразовий одноразовий лайнер? Щось на зразок perl -e 'alarm shift; exec "ping google.com"?
mwfearnley

На жаль, це генерує 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

Ви можете обмежити час виконання будь-якої програми, використовуючи цю команду:

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

9
Це, мабуть, не те, що ви хочете. У результаті команда виконується рівно 5 секунд. Це означає, що якщо ви хочете, щоб це був максимальний час, але не мінімальний, це не те, що ви шукаєте
gesell

2

Пакет часу очікування з Ubuntu / Debian можна створити для компіляції на Mac, і він працює. Пакет доступний за адресою http://packages.ubuntu.com/lucid/timeout


2
Більш простий спосіб - використовувати 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 прапор можна змінити на будь-яке число.


2
Пінг був справді зразком. Я хочу запустити програму для збору деяких показників
sheki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.