Pada mesin saya, saya perlu menjalankan siklus yang mengulang 1 perintah sederhana yang harus memiliki penundaan dinyatakan dalam sepersekian detik.
Katakanlah saya perlu:
- untuk menyimpan file dengan enumaration yang meningkat (file-0, file-1, file-2, ...) dihasilkan oleh sesuatu yang sepele untuk contoh ini seperti
time > file-$x
- Saya perlu melakukan ini setiap 1/70 detik (sebagai contoh) karena saya ingin mengekspresikan waktu saya dengan pecahan detik.
Bagaimana saya bisa benar-benar tepat dan memiliki semua yang diungkapkan dengan skrip bash?
Fraksi dapat menghasilkan jumlah yang tidak dapat ditentukan, saya harus tepat dan jadi saya membutuhkan setidaknya 4-5 desimal.
Mungkin Anda bisa langsung lari
?
di
archlinux
distro saya :sumber
sleep
memungkinkan pecahan? dapatkah Anda memberikan contoh lengkap dengan loop palsu?Memunculkan proses dan memuat executable baru di dalamnya kemungkinan akan memakan waktu beberapa milidetik, sehingga ketepatan seperti itu tidak masuk akal. Perhatikan juga bahwa waktu CPU pada banyak sistem dialokasikan untuk proses dengan irisan hingga 10 ms.
Karena itu, beberapa
sleep
implementasi mengambil bilangan pecahan detik, dan baik zsh dan ksh93 dapat membuat$SECONDS
pecahan variabel khusus merekatypeset -F SECONDS
.Contoh (zsh):
Ups, itu melayang. Anda dapat menyesuaikan waktu tidur berdasarkan
$SECONDS
:2 milidetik tambahan itu mungkin harus dipertanggungjawabkan untuk menjalankan yang terakhir
sleep
dandate
perintah.Perhatikan juga bahwa zsh memiliki
zselect
builtin dengan batas waktu dinyatakan dalam seperseratus detik. Dan ksh93 memilikisleep
built in (dan menerima floating point) danprintf
dapat mencetak tanggal / waktu.Jika Anda menginginkan sesuatu yang lebih tepat, Anda mungkin menginginkan sistem operasi waktu nyata atau sistem operasi dengan kemampuan waktu nyata dan tentu saja tidak menggunakan shell.
sumber
sleep 1/70
tidak diizinkan di mesin saya ...Jika shell
sleep
Anda tidak menerima pecahan, gunakan perl.Jika Anda perlu mengetahui fraksi, gunakan
echo "scale=5; 1/70" | bc
sumber
Di bawah Alpine Linux (Busybox) Anda dapat mengulang dengan mikrodetik
usleep 10
(setara dengan0.00001
satu detik)GNU sleep
mendukung sebagian kecil dari yang kedua:sleep 0.00001
sumber