Mac OS X 上的超时命令?

Posted

技术标签:

【中文标题】Mac OS X 上的超时命令?【英文标题】:Timeout command on Mac OS X? 【发布时间】:2011-03-31 02:47:07 【问题描述】:

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

例如:

timeout 10 ping google.com

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

【问题讨论】:

另见unix.stackexchange.com/questions/43340/… 【参考方案1】:

你可以使用

brew install coreutils

然后当你需要超时时,使用

gtimeout

..相反。为了解释为什么这里有一个来自 Homebrew Caveats 部分的 sn-p:

注意事项

所有命令都安装了前缀“g”。

如果你真的需要用它们的正常名称来使用这些命令,你 可以从 bashrc 中将“gnubin”目录添加到 PATH,例如:

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

此外,如果您添加,您可以使用正常名称访问他们的手册页 也可以从 bashrc 将“gnuman”目录添加到 MANPATH:

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

【讨论】:

那么:别名 timeout=gtimeout ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout 仅启用一个命令(别名解决方案适用于交互式 CLI 使用,但不适用于从 bash 脚本调用时)。 在我这边安装 coerutils 后我得到了超时可用超时:ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout ln: /usr/local/bin/超时:文件存在 更新:我刚刚使用brew install coreutils 安装了coreutils,并且timeout 命令在没有前缀的情况下可用。 很好——但我对引入(然后忘记)依赖关系感到紧张。我更喜欢 perl 解决方案,因为它是原生的。【参考方案2】:

另一种几乎可以跨平台工作的简单方法(因为它使用几乎无处不在的 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://***.com/questions/601543/command-line-command-to-auto-kill-a-command-after-a-certain-amount-of-time
# 
perl -e 'alarm shift; exec @ARGV' "$@";

【讨论】:

不包装在函数中直接使用会怎样? 这几乎只是删除函数并留下 perl 行......我在上面放了更多细节! 单次使用的单衬管是什么样的? perl -e 'alarm shift; exec "ping google.com" 之类的东西? 不幸的是,这会在计时器到期时生成Alarm clock 消息,并消除此gets messy。 当您需要更高的精度时,最好添加 ualarm 版本:function timeout() perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; (请注意,根据perldoc.perl.org/functions/alarm.html,它需要 Perl >= 5.8)【参考方案3】:

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

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

【讨论】:

这可能不是你想要的。结果是该命令将运行 5 秒。意思是,如果您希望它是最大时间而不是最小时间,那么这不是您要寻找的 一开始我不明白@gesell 在说什么。但运行此命令后:` ping -t 1 google.com & sleep 5; kill $!` 我明白了他/她的意思:整个表达式在终止前需要整整 5 秒。但是,这是我选择的解决方案,因为我在后台线程中从 python 程序运行 bash 命令 - 只要它在某个时候终止,我就很高兴。【参考方案4】:

来自 Ubuntu / Debian 的 Timeout 包可以在 Mac 上编译并且可以工作。 该软件包可在http://packages.ubuntu.com/lucid/timeout获取。

【讨论】:

一种更简单的方法是使用 Homebrew:brew install coreutils - 然后使用 gtimeout 或将您的 PATH 设置为使用 timeout 名称。 从 Ubuntu 20.04 开始,似乎没有单独的 timeout 包。 timeout 命令由coreutils 提供。【参考方案5】:

作为kvz stated,只需使用自制软件:

brew install coreutils

现在timeout 命令已经可以使用了 - 不需要别名(也不需要gtimeout,虽然也可以使用)。

【讨论】:

【参考方案6】:

你可以ping -t 10 google.com &gt;nul

>nul 去掉了输出。因此,它不会显示 64 BYTES FROM 123.45.67.8 BLAH BLAH BLAH 它只会显示一个空白换行符,直到超时。 -t 标志可以更改为任意数字。

【讨论】:

Ping 确实是一个示例。我想运行一个程序来收集一些指标

以上是关于Mac OS X 上的超时命令?的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X 上的`probemod` 打印出神秘的 hexdump 而不是模块名称

Mac OS X 10.8.3 上的 gfortran/gcc4.8

尝试在 Mac OS X 10.7.5 上的 usr/local/bin 中安装 composer

RE 错误:Mac OS X 上的非法字节序列

无法连接到 Mac OS X 上的 Docker 守护程序

Mac OS X 上的 JRE lib/security 目录在哪里?