sleep adalah perintah yang sangat populer dan kita dapat mulai tidur dari 1 detik:
# wait one second please
sleep 1
tapi apa alternatifnya jika saya harus menunggu hanya 0,1 detik atau antara 0,1 hingga 1 detik?
- komentar: di linux atau OS X
sleep 0.XXX
berfungsi dengan baik, tetapi pada solarissleep 0.1
atausleep 0.01
- sintaksis ilegal
echo "" >/dev/null
Jawaban:
Bash memiliki sleep "loadable" yang mendukung pecahan detik, dan menghilangkan overhead perintah eksternal:
Kemudian:
The downside adalah bahwa loadable mungkin tidak disediakan dengan
bash
biner Anda , jadi Anda perlu mengkompilasi sendiri seperti yang ditunjukkan (meskipun pada Solaris itu tidak harus sesederhana seperti di atas).Pada
bash-4.4
(September 2016) semua loadable sekarang dibangun dan diinstal secara default pada platform yang mendukungnya, meskipun mereka dibangun sebagai file shared-object yang terpisah, dan tanpa.so
akhiran. Kecuali jika distro / OS Anda telah melakukan sesuatu yang kreatif, Anda seharusnya dapat melakukannya:(Halaman manual menunjukkan
BASH_LOADABLES_PATH
diset secara otomatis, saya menemukan ini bukan kasus dalam distribusi resmi pada 4.4.12. Jika dan ketika diatur dengan benar Anda hanya perluenable -f filename commandname
seperti yang diperlukan.)Jika itu tidak cocok, hal termudah berikutnya yang harus dilakukan adalah membangun atau memperoleh
sleep
dari GNU coreutils, ini mendukung fitur yang diperlukan.sleep
Perintah POSIX minimal, versi Solaris lama hanya mengimplementasikannya. Solaris 11sleep
tidak mendukung detik pecahan.Sebagai upaya terakhir, Anda dapat menggunakan
perl
(atau skrip lain yang harus Anda tangani) dengan peringatan bahwa menginisialisasi juru bahasa mungkin sebanding dengan waktu tidur yang dimaksudkan:sumber
expect
Anda mungkin hanya bisa menggunakan "after N
", di mana N adalah milidetik, langsung di skrip Anda.usleep
seperti @Luis Vazquez dan @sebix writeDokumentasi untuk
sleep
perintah dari coreutils mengatakan:Karenanya Anda dapat menggunakan
sleep 0.1
,sleep 1.0e-1
dan argumen serupa.sumber
Tidur menerima angka desimal sehingga Anda dapat memecahnya seperti ini:
1/2 detik
1/100 detik
Jadi untuk milidetik yang Anda inginkan
sumber
sleep .5
Coba ini untuk menentukan akurasi:
Kombinasi solusi mr.spuratic dan solusi coles .
sumber
Anda cukup menggunakan
usleep
. Dibutuhkan mikrodetik (= 1e-6 detik) sebagai parameter, jadi untuk tidur 1 milidetik Anda akan memasukkan:sumber
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
bagian dariinitscripts
paket yang standar setidaknya di semua distribusi yang diturunkan Red Hat; termasuk setidaknya RHEL, CentOS, Fedora, Mageia / Mandriva dan SuSE. Berikut sebuah contoh: `` ``sleep
(dari coreutils ) bekerja dengan detik -usleep
(dari skrip init ) bekerja dengan mikro-detikSaya memiliki masalah yang sama (tidak ada shell yang menggunakan Solaris) jadi saya menulis sendiri:
Tidak memeriksa argumen - Saya akan merekomendasikan yang ditulis dengan benar jika Anda ingin menyimpannya tetapi itu (gcc usleep.c -o usleep) akan membuat Anda keluar dari lubang.
sumber
usleep()
panggilan kosongif(argc == 1) { usleep(atoi(argv[1])); }
untuk menghindari pengindeksan di luar batas array, yang dapat menyebabkan sejumlah perilaku tak terduga.if (argc == 2) { usleep(atoi(argv[1])); }
...usleep
unit adalah μs, jadi untuk menunggu 1 detik, Anda perlu memberikan argumen 1000000.atoi()
adalah pilihan yang mengerikan untuk mengubah string menjadiint
. Apa yangatoi( "STRING" )
kembali?atoi()
tidak memiliki cara untuk mengembalikan kesalahan apa pun.Saya suka ide usleep, tapi saya tidak bisa berkomentar di bawahnya. Karena ini membantu saya, saya harap saran saya dapat meningkatkan ide tidur.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c adalah kode sumber aktual untuk usleep.c pada ekosistem redhat.
Cobalah untuk mengkompilasi itu di Solaris Anda. Anda mungkin perlu https://www.opencsw.org/packages/libpopt0/ .
sumber