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:
Selain itu, Anda dapat mengakses halaman manual mereka dengan nama normal jika Anda menambahkan direktori "gnuman" ke MANPATH Anda dari bashrc Anda juga:
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:
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:
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
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.
Jawaban:
Kamu bisa memakai
Dan kemudian kapan pun Anda membutuhkan waktu tunggu, gunakan
..sebagai gantinya. Untuk menjelaskan mengapa berikut cuplikan dari bagian Homebrew Caveats:
sumber
ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout
hanya mengaktifkan satu perintah (solusi alias berfungsi untuk penggunaan CLI interaktif, tetapi tidak saat dipanggil dari skrip bash).brew install coreutils
, dantimeout
perintah tersedia tanpa awalan.Pendekatan sederhana lain yang bekerja cukup banyak lintas platform (karena menggunakan perl yang hampir ada di mana-mana) adalah ini:
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
atau versi yang memiliki bantuan / contoh bawaan:
timeout.sh
sumber
perl -e 'alarm shift; exec "ping google.com"
?Alarm clock
pesan ketika pengatur waktu kedaluwarsa, dan menghilangkan ini menjadi berantakan .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 )Anda dapat membatasi waktu eksekusi program apa pun menggunakan perintah ini:
sumber
Paket Timeout dari Ubuntu / Debian dapat dibuat untuk dikompilasi di Mac dan berfungsi. Paket ini tersedia di http://packages.ubuntu.com/lucid/timeout
sumber
brew install coreutils
- kemudian gunakangtimeout
atau setel PATH Anda untuk menggunakantimeout
nama tersebut.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.
sumber