Perintah batas waktu di Mac OS X?


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"

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

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 $!

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


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.


2
Ping benar-benar contoh. Saya ingin menjalankan program untuk mengumpulkan beberapa metrik
sheki
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.