Mac OS Xのタイムアウトコマンド?


回答:


139

あなたが使用することができます

brew install coreutils

そして、タイムアウトが必要なときはいつでも、

gtimeout

..代わりに 自作の警告セクションからの抜粋がここにある理由を説明するために:

警告

すべてのコマンドは、接頭辞「g」を付けてインストールされています。

これらのコマンドを通常の名前で本当に使用する必要がある場合は、次のようにbashrcからPATHに「gnubin」ディレクトリを追加できます。

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

さらに、bashrcからMANPATHに「gnuman」ディレクトリを追加すると、通常の名前でmanページにアクセスできます。

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

22
次に:alias timeout = gtimeout
nkadwa

1
またはln -s /usr/local/bin/gtimeout /usr/local/bin/timeout、1つのコマンドを有効にするだけです(エイリアスソリューションはインタラクティブなCLIで使用できますが、bashスクリプトから呼び出された場合は機能しません)。
ジョン

1
coerutilsをインストールした後、タイムアウトとしてタイムアウトを使用できるようになりました:ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln:/ usr / local / bin / timeout:ファイルが存在します
talsibony

1
更新:を使用してcoreutilsをインストールbrew install coreutilsしたところ、timeoutコマンドはプレフィックスなしで使用できました。
tdensmore

25

クロスプラットフォームで機能するもう1つの簡単なアプローチは、次のとおりです(ほぼすべての場所にある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 2016年

関数を削除してperl行を残すだけです...詳細を上に示します!
ブラッドパークス

使い捨てのワンライナーとしてはどのように見えますか?のようなものperl -e 'alarm shift; exec "ping google.com"
mwfearnley 2016年

残念ながら、これAlarm clockはタイマーの期限が切れるとメッセージを生成し、これを排除するのは面倒です。
RichVel 2017年

1
:あなたがより高い精度が必要な場合のためのualarm関数のバージョンを追加するには良いでしょう function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (それはによるPerlの> = 5.8が必要なことに注意してくださいperldoc.perl.org/functions/alarm.html
ジブ

7

このコマンドを使用して、任意のプログラムの実行時間を制限できます。

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

9
これはおそらくあなたが望むものではありません。その結果、コマンドは正確に5秒実行されます。つまり、最大時間であり、最小時間ではない場合、これはあなたが探しているものではありません
gesell 2015

2

Ubuntu / DebianのタイムアウトパッケージはMacでコンパイルでき、動作します。パッケージはhttp://packages.ubuntu.com/lucid/timeoutで入手できます。


2
より簡単な方法は、Homebrewを使用することです。-brew install coreutils次にgtimeouttimeout名前を使用するようにPATHを使用または設定します。
RichVel 2017年

1

できるよ ping -t 10 google.com >nul

> nulは出力を取り除きます。したがって、123.45.67.8 BLAH BLAH BLAHから64バイトを表示する代わりに、タイムアウトするまで空白の改行を表示します。-tフラグは任意の数に変更できます。


2
pingは本当にサンプルでした。いくつかのメトリックを収集するプログラムを実行したい
sheki 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.