Timeout Command on Mac OS X?

2019-02-01 15:53发布

Is there an alternative for the timeout command on Mac OSx. The basic requirement is I am able to run a command for a specified amount of time.

e.g:

timeout 10 ping google.com

This program runs ping for 10s on Linux.

标签: macos timeout
5条回答
干净又极端
2楼-- · 2019-02-01 16:10

The Timeout Package from Ubuntu / Debian can be made to compile on Mac and it works. The package is available at http://packages.ubuntu.com/lucid/timeout

查看更多
Anthone
3楼-- · 2019-02-01 16:13

Another simple approach that works pretty much cross platform (because it uses perl which is nearly everywhere) is this:

function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

Snagged from here: https://gist.github.com/jaytaylor/6527607

Instead of putting it in a function, you can just put the following line in a script, and it'll work too:

timeout.sh

perl -e 'alarm shift; exec @ARGV' "$@";

or a version that has built in help/examples:

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' "$@";
查看更多
4楼-- · 2019-02-01 16:19

You can use

brew install coreutils

And then whenever you need timeout, use

gtimeout

..instead. To explain why here's a snippet from the Homebrew Caveats section:

Caveats

All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you can add a "gnubin" directory to your PATH from your bashrc like:

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

Additionally, you can access their man pages with normal names if you add the "gnuman" directory to your MANPATH from your bashrc as well:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
查看更多
干净又极端
5楼-- · 2019-02-01 16:31

Unfortunately there is no timeout program on macos afaik, however you can try the answers metioned here: Command line command to auto-kill a command after a certain amount of time

Futhermore if you really want to run "ping" here you can just run

ping -t 10 google.com
查看更多
手持菜刀,她持情操
6楼-- · 2019-02-01 16:32

You can limit execution time of any program using this command:

ping -t 10 google.com & sleep 5; kill $!
查看更多
登录 后发表回答