Comando Timeout su Mac OS X?


Risposte:


139

Puoi usare

brew install coreutils

E poi ogni volta che hai bisogno di timeout, usa

gtimeout

..anziché. Per spiegare perché ecco uno snippet dalla sezione Homebrew Caveats:

Avvertenze

Tutti i comandi sono stati installati con il prefisso "g".

Se hai davvero bisogno di usare questi comandi con i loro nomi normali, puoi aggiungere una directory "gnubin" al tuo PATH dal tuo bashrc come:

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

Inoltre, puoi accedere alle loro pagine man con nomi normali se aggiungi la directory "gnuman" al tuo MANPATH anche dal tuo bashrc:

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

22
Quindi: alias timeout = gtimeout
nkadwa

1
O ln -s /usr/local/bin/gtimeout /usr/local/bin/timeoutper abilitare solo un comando (la soluzione alias funziona per l'uso interattivo della CLI, ma non quando viene chiamata dagli script bash).
John Y

1
Dalla mia parte dopo aver installato coerutils ho ottenuto il timeout disponibile come timeout: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: File esiste
talsibony

1
Aggiornamento: ho appena installato coreutils usando brew install coreutilse il timeoutcomando era disponibile senza il prefisso.
tdensmore

25

Un altro semplice approccio che funziona praticamente su più piattaforme (perché utilizza perl che è quasi ovunque) è questo:

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

Catturato da qui: https://gist.github.com/jaytaylor/6527607

Invece di metterlo in una funzione, puoi semplicemente inserire la seguente riga in uno script e funzionerà anche:

timeout.sh

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

o una versione che ha integrato la guida / esempi:

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

Come ci si sente ad usarlo direttamente, senza avvolgerlo in una funzione?
mwfearnley

è praticamente solo rimuovere la funzione e lasciare la riga perl ... ho messo più dettagli sopra!
Brad Parks

Che aspetto ha un monopezzo monouso? Qualcosa di simile perl -e 'alarm shift; exec "ping google.com"?
mwfearnley

Sfortunatamente questo genera un Alarm clockmessaggio quando il timer scade e l'eliminazione diventa complicata .
RichVel

1
Sarebbe bene aggiungere la versione ualarm per quando hai bisogno di maggiore precisione: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Nota che richiede Perl> = 5.8 secondo perldoc.perl.org/functions/alarm.html )
gib

7

È possibile limitare il tempo di esecuzione di qualsiasi programma utilizzando questo comando:

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

9
Questo probabilmente non è quello che vuoi. Il risultato è che il comando verrà eseguito esattamente 5 secondi. Significa che se vuoi che sia un tempo massimo ma non anche il minimo questo non è quello che stai cercando
gesell

2

Il pacchetto Timeout da Ubuntu / Debian può essere compilato su Mac e funziona. Il pacchetto è disponibile su http://packages.ubuntu.com/lucid/timeout


2
Un modo più semplice è usare Homebrew: brew install coreutils- quindi usa gtimeouto imposta il tuo PATH per usare il timeoutnome.
RichVel

1

Tu puoi fare ping -t 10 google.com >nul

il> nul elimina l'output. Quindi, invece di mostrare 64 BYTES DA 123.45.67.8 BLAH BLAH BLAH mostrerà solo una nuova riga vuota finché non scade. -t flag può essere cambiato con qualsiasi numero.


2
Ping era davvero un campione. Voglio eseguire un programma per raccogliere alcune metriche
sheki
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.