Mac OS X上的超时命令?

she*_*eki 67 macos timeout

在Mac OSx上是否有替代超时命令.基本要求是我能够在指定的时间内运行命令.

例如:

timeout 10 ping google.com
Run Code Online (Sandbox Code Playgroud)

这个程序在Linux上运行ping 10秒.

kvz*_*kvz 112

您可以使用

brew install coreutils
Run Code Online (Sandbox Code Playgroud)

然后,无论何时需要超时,请使用

gtimeout
Run Code Online (Sandbox Code Playgroud)

..代替.解释为什么这里是Homebrew警告部分的片段:

注意事项

所有命令都安装了前缀'g'.

如果您确实需要将这些命令与其正常名称一起使用,则可以从bashrc向PATH添加"gnubin"目录,如:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
Run Code Online (Sandbox Code Playgroud)

此外,如果从bashrc向"MANPATH"添加"gnuman"目录,则可以使用普通名称访问其手册页:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Run Code Online (Sandbox Code Playgroud)

  • 然后:alias timeout = gtimeout (15认同)
  • 或者 `ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout` 仅启用一个命令(别名解决方案适用于交互式 CLI 使用,但不适用于从 bash 脚本调用)。 (3认同)
  • 在我这边安装 coerutils 后,我得到了超时: ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout ln: /usr/local/bin/timeout: 文件存在 (2认同)
  • 更新:我刚刚使用“brew install coreutils”安装了 coreutils,并且“timeout”命令无需前缀即可使用。 (2认同)

jon*_*ckt 27

正如kvz 所说,只需使用自制程序:

brew install coreutils
Run Code Online (Sandbox Code Playgroud)

现在该timeout命令已经可以使用了- 不需要别名(并且不需要gtimeout,尽管也可用)。


Bra*_*rks 18

另一个非常简单的跨平台方法(因为它使用几乎无处不在的perl)是这样的:

function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }
Run Code Online (Sandbox Code Playgroud)

从这里抓住:https://gist.github.com/jaytaylor/6527607

您可以将以下行放在脚本中,而不是将其放在函数中,它也可以工作:

timeout.sh

perl -e 'alarm shift; exec @ARGV' "$@";
Run Code Online (Sandbox Code Playgroud)

或内置帮助/示例的版本:

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' "$@";
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用此命令限制任何程序的执行时间:

ping -t 10 google.com & sleep 5; kill $!
Run Code Online (Sandbox Code Playgroud)

  • 这可能不是你想要的.结果是命令将运行5秒钟.意思是,如果你想要它是最大时间而不是最小时间这不是你想要的 (7认同)