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 >nul
>nul 去掉了输出。因此,它不会显示 64 BYTES FROM 123.45.67.8 BLAH BLAH BLAH 它只会显示一个空白换行符,直到超时。 -t 标志可以更改为任意数字。
【讨论】:
Ping 确实是一个示例。我想运行一个程序来收集一些指标>nul
是 Windows 的东西。在 macOS 上,这实际上会创建一个名为 nul
的文件并将输出重定向到它以上是关于Mac OS X 上的超时命令?的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS X 上的`probemod` 打印出神秘的 hexdump 而不是模块名称
Mac OS X 10.8.3 上的 gfortran/gcc4.8