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.