MacOSxでtimeoutコマンドの代替手段はありますか?基本的な要件は、指定された時間だけコマンドを実行できることです。
例えば:
timeout 10 ping google.com
このプログラムは、Linux上で10秒間pingを実行します。
回答:
あなたが使用することができます
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"
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
、1つのコマンドを有効にするだけです(エイリアスソリューションはインタラクティブなCLIで使用できますが、bashスクリプトから呼び出された場合は機能しません)。
brew install coreutils
したところ、timeout
コマンドはプレフィックスなしで使用できました。
クロスプラットフォームで機能するもう1つの簡単なアプローチは、次のとおりです(ほぼすべての場所にあるperlを使用しているため)。
function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }
ここから引っ掛かります:https://gist.github.com/jaytaylor/6527607
関数に入れる代わりに、スクリプトに次の行を入れるだけで、それも機能します。
perl -e 'alarm shift; exec @ARGV' "$@";
またはヘルプ/例が組み込まれているバージョン:
#!/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' "$@";
perl -e 'alarm shift; exec "ping google.com"
?
Alarm clock
はタイマーの期限が切れるとメッセージを生成し、これを排除するのは面倒です。
function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; }
(それはによるPerlの> = 5.8が必要なことに注意してくださいperldoc.perl.org/functions/alarm.html)
このコマンドを使用して、任意のプログラムの実行時間を制限できます。
ping -t 10 google.com & sleep 5; kill $!
Ubuntu / DebianのタイムアウトパッケージはMacでコンパイルでき、動作します。パッケージはhttp://packages.ubuntu.com/lucid/timeoutで入手できます。
brew install coreutils
次にgtimeout
、timeout
名前を使用するようにPATHを使用または設定します。
できるよ ping -t 10 google.com >nul
> nulは出力を取り除きます。したがって、123.45.67.8 BLAH BLAH BLAHから64バイトを表示する代わりに、タイムアウトするまで空白の改行を表示します。-tフラグは任意の数に変更できます。