Perintah batas waktu di Mac OS X?

90

Apakah ada alternatif untuk perintah batas waktu di Mac OSx. Persyaratan dasarnya adalah saya dapat menjalankan perintah untuk jangka waktu tertentu.

misalnya:

timeout 10 ping google.com

Program ini menjalankan ping selama 10 detik di Linux.

sheki
sumber
Lihat juga unix.stackexchange.com/questions/43340/…
Joshua Goldberg

Jawaban:

134

Kamu bisa memakai

brew install coreutils

Dan kemudian kapan pun Anda membutuhkan waktu tunggu, gunakan

gtimeout

..sebagai gantinya. Untuk menjelaskan mengapa berikut cuplikan dari bagian Homebrew Caveats:

Peringatan

Semua perintah telah diinstal dengan awalan 'g'.

Jika Anda benar-benar perlu menggunakan perintah ini dengan nama normalnya, Anda dapat menambahkan direktori "gnubin" ke PATH Anda dari bashrc seperti:

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

Selain itu, Anda dapat mengakses halaman manual mereka dengan nama normal jika Anda menambahkan direktori "gnuman" ke MANPATH Anda dari bashrc Anda juga:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
kvz
sumber
22
Kemudian: alias timeout = gtimeout
nkadwa
1
Atau ln -s /usr/local/bin/gtimeout /usr/local/bin/timeouthanya mengaktifkan satu perintah (solusi alias berfungsi untuk penggunaan CLI interaktif, tetapi tidak saat dipanggil dari skrip bash).
John Y
1
Di sisi saya setelah menginstal coerutils, saya mendapat waktu tunggu yang tersedia sebagai waktu habis: ln -s / usr / local / bin / gtimeout / usr / local / bin / timeout ln: / usr / local / bin / timeout: File sudah ada
talsibony
Pembaruan: Saya baru saja menginstal coreutils menggunakan brew install coreutils, dan timeoutperintah tersedia tanpa awalan.
tdensmore
24

Pendekatan sederhana lain yang bekerja cukup banyak lintas platform (karena menggunakan perl yang hampir ada di mana-mana) adalah ini:

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

Tersangkut dari sini: https://gist.github.com/jaytaylor/6527607

Alih-alih meletakkannya dalam sebuah fungsi, Anda bisa meletakkan baris berikut dalam sebuah skrip, dan itu akan bekerja juga:

timeout.sh

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

atau versi yang memiliki bantuan / contoh bawaan:

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' "$@";
Brad Parks
sumber
Bagaimana rasanya menggunakannya secara langsung, tanpa membungkusnya dalam suatu fungsi?
mwfearnley
cukup banyak hapus saja fungsinya dan tinggalkan baris perl ... Saya berikan detail lebih lanjut di atas!
Brad Parks
Bagaimana tampilannya sebagai baris sekali pakai? Sesuatu seperti perl -e 'alarm shift; exec "ping google.com"?
mwfearnley
Sayangnya ini menghasilkan Alarm clockpesan ketika pengatur waktu kedaluwarsa, dan menghilangkan ini menjadi berantakan .
RichVel
1
Akan lebih baik untuk menambahkan versi ualarm ketika Anda membutuhkan lebih banyak presisi: function timeout() { perl -e 'use Time::HiRes "ualarm"; ualarm shift; exec @ARGV' "$@"; } (Perhatikan bahwa itu membutuhkan Perl> = 5,8 menurut perldoc.perl.org/functions/alarm.html )
gib
6

Anda dapat membatasi waktu eksekusi program apa pun menggunakan perintah ini:

ping -t 10 google.com & sleep 5; kill $!
deadmoto
sumber
9
Ini mungkin bukan yang Anda inginkan. Hasilnya adalah perintah akan berjalan tepat 5 detik. Artinya, jika Anda ingin waktu yang maksimal tetapi tidak juga menit ini bukan yang Anda cari
gesell
2

Paket Timeout dari Ubuntu / Debian dapat dibuat untuk dikompilasi di Mac dan berfungsi. Paket ini tersedia di http://packages.ubuntu.com/lucid/timeout

sheki
sumber
2
Cara yang lebih mudah adalah dengan menggunakan Homebrew: brew install coreutils- kemudian gunakan gtimeoutatau setel PATH Anda untuk menggunakan timeoutnama tersebut.
RichVel
1

Anda dapat melakukan ping -t 10 google.com >nul

yang> nul menghilangkan output. Jadi alih-alih menampilkan 64 BYTES FROM 123.45.67.8 BLAH BLAH BLAH itu hanya akan menampilkan baris baru kosong sampai batas waktu. Bendera -t dapat diubah menjadi nomor apa pun.

redCube
sumber
2
Ping benar-benar contoh. Saya ingin menjalankan program untuk mengumpulkan beberapa metrik
sheki