Mac OS X의 시간 초과 명령?


답변:


134

당신이 사용할 수있는

brew install coreutils

그런 다음 시간 초과가 필요할 때마다

gtimeout

.. 대신. Homebrew주의 사항 섹션에서 발췌 한 이유를 설명하려면 :

주의 사항

모든 명령은 접두사 'g'로 설치되었습니다.

이러한 명령을 정상적인 이름으로 사용해야하는 경우 다음과 같이 bashrc에서 PATH에 "gnubin"디렉토리를 추가 할 수 있습니다.

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

또한 bashrc에서 "gnuman"디렉토리를 MANPATH에 추가하면 일반 이름으로 해당 매뉴얼 페이지에 액세스 할 수 있습니다.

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

21
그런 다음 : alias timeout = gtimeout
nkadwa

1
또는 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을 사용하기 때문에 거의 크로스 플랫폼에서 작동하는 또 다른 간단한 접근 방식은 다음과 같습니다.

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

함수를 제거하고 펄 라인을 남겨 두는 것입니다.
Brad Parks

일회용 원 라이너는 어떻게 생겼습니까? 같은 거 perl -e 'alarm shift; exec "ping google.com"?
mwfearnley 2016

불행히도 이것은 Alarm clock타이머가 만료되면 메시지를 생성하고 이것을 제거하면 지저분 해 집니다.
RichVel 2011

1
더 많은 정밀도가 필요할 때 ualarm 버전을 추가하는 것이 좋습니다. function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } ( perldoc.perl.org/functions/alarm.html 에 따라 Perl> = 5.8이 필요합니다. )
gib

6

다음 명령을 사용하여 모든 프로그램의 실행 시간을 제한 할 수 있습니다.

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

9
이것은 아마도 당신이 원하는 것이 아닙니다. 그 결과 명령이 정확히 5 초 동안 실행됩니다. 의미, 만약 당신이 최대 시간을 원하지만 최소가 아니라면 이것은 당신이 찾고있는 것이 아닙니다
gesell

2

Ubuntu / Debian의 Timeout Package는 Mac에서 컴파일하도록 만들 수 있으며 작동합니다. 패키지는 http://packages.ubuntu.com/lucid/timeout 에서 사용할 수 있습니다 .


2
더 쉬운 방법은 Homebrew를 사용하는 것입니다 brew install coreutils.-그런 다음 이름 gtimeout을 사용하도록 PATH를 사용하거나 설정합니다 timeout.
RichVel 2011

1

넌 할 수있어 ping -t 10 google.com >nul

> nul은 출력을 제거합니다. 따라서 123.45.67.8 BLAH BLAH BLAH에서 64 바이트를 표시하는 대신 시간이 초과 될 때까지 빈 줄 바꿈 만 표시합니다. -t 플래그는 임의의 숫자로 변경할 수 있습니다.


2
Ping은 정말 샘플이었습니다. 나는 몇 가지 통계를 수집하는 프로그램을 실행하려면
셰키
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.