Mac OS X上的超时命令?


Answers:


134

您可以使用

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"

21
然后:alias timeout = gtimeout
nkadwa

1
或者ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout仅启用一个命令(别名解决方案可用于交互式CLI,但从bash脚本调用时不起作用)。
约翰Y

1
在安装coerutils之后,我可以超时:ln -s / usr / local / bin / gtimeout / usr / local / bin / time 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

除了将其放在函数中,您还可以将以下行放入脚本中,它也将起作用:

超时时间

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' "$@";

无需将其包装在函数中即可直接使用它是什么样子?
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 2015年


1

你可以做 ping -t 10 google.com >nul

> nul摆脱输出。因此,除了显示123.45.67.8 BLAH BLAH BLAH的64个BYTES外,它还显示一个空白的换行符直到超时。-t标志可以更改为任何数字。


2
平真的是一个样本。我想运行一个程序来收集一些指标
sheki 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.