Mac OSx上的timeout命令是否有替代方法?基本要求是我能够在指定的时间内运行命令。
例如:
timeout 10 ping google.com
该程序在Linux上ping 10s。
Answers:
您可以使用
brew install coreutils
然后每当您需要超时时,使用
gtimeout
..代替。要解释为什么这是“自制”警告中的摘录:
注意事项
所有命令均已安装前缀“ g”。
如果确实需要使用这些命令的常规名称,则可以从bashrc将“ gnubin”目录添加到PATH中,例如:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
此外,如果还从bashrc中将“ gnuman”目录添加到MANPATH,则可以使用普通名称访问其手册页:
MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
仅启用一个命令(别名解决方案可用于交互式CLI,但从bash脚本调用时不起作用)。
brew install coreutils
,并且该timeout
命令没有前缀即可使用。
在跨平台上非常有效的另一种简单方法(因为它使用了几乎无处不在的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"
什么?
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的Timeout软件包可以在Mac上编译,并且可以工作。该软件包可从http://packages.ubuntu.com/lucid/timeout获得。
brew install coreutils
-然后使用gtimeout
或设置PATH以使用timeout
名称。
你可以做 ping -t 10 google.com >nul
> nul摆脱输出。因此,除了显示123.45.67.8 BLAH BLAH BLAH的64个BYTES外,它还显示一个空白的换行符直到超时。-t标志可以更改为任何数字。