web-dev-qa-db-fra.com

Commande de délai d'attente sur Mac OS X?

Existe-t-il une alternative pour la commande timeout sur Mac OSx. L'exigence de base est que je suis capable d'exécuter une commande pendant une durée spécifiée.

par exemple:

timeout 10 ping google.com

Ce programme exécute le ping pendant 10 secondes sous Linux.

63
sheki

Vous pouvez utiliser

brew install coreutils

Et puis chaque fois que vous avez besoin d'un délai, utilisez

gtimeout

..au lieu. Pour expliquer pourquoi voici un extrait de la section Homebrew Caveats:

Avertissements

Toutes les commandes ont été installées avec le préfixe "g".

Si vous avez vraiment besoin d'utiliser ces commandes avec leurs noms normaux, vous pouvez ajouter un répertoire "gnubin" à votre PATH depuis votre bashrc comme:

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

De plus, vous pouvez accéder à leurs pages de manuel avec des noms normaux si vous ajoutez également le répertoire "gnuman" à votre MANPATH à partir de votre bashrc:

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

Une autre approche simple qui fonctionne à peu près sur plusieurs plates-formes (car elle utilise Perl qui est presque partout) est la suivante:

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

Accroché d'ici: https://Gist.github.com/jaytaylor/6527607

Au lieu de le mettre dans une fonction, vous pouvez simplement mettre la ligne suivante dans un script, et cela fonctionnera aussi:

timeout.sh

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

ou une version qui a intégré l'aide/exemples:

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

Vous pouvez limiter le temps d'exécution de n'importe quel programme en utilisant cette commande:

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

Le paquet Timeout d'Ubuntu/Debian peut être compilé sur Mac et cela fonctionne. Le package est disponible sur http://packages.ubuntu.com/lucid/timeout

2
sheki

Tu peux faire ping -t 10 google.com >nul

le> nul se débarrasse de la sortie. Ainsi, au lieu d'afficher 64 octets à partir de 123.45.67.8 BLAH BLAH BLAH, il affichera simplement une nouvelle ligne vierge jusqu'à ce qu'elle expire. Le drapeau -t peut être changé en n'importe quel nombre.

1
redCube