Soru Bash veya ksh cinsinden bir milisaniye nasıl uyurum


uyku çok popüler bir komuttur ve 1 saniyeden uykuya başlayabiliriz:

# wait one second please 
sleep 1

ama alternatif olarak sadece 0.1 saniye veya 0.1 ila 1 saniye arasında beklemem gerekirse?

  • remark: linux veya OS X'te sleep 0.XXX iyi çalışıyor, ama solaris üzerinde sleep 0.1 veya sleep 0.01 - yasa dışı sözdizimi

105
2018-01-15 13:19


Menşei


1ms için neden uyumak istediğini sorabilir miyim? - Tom O'Connor
Tabii ki, benim betik betiğimde, bazı satırlarda "sleep 1" i ekledim, fakat betik çok yavaş çalışıyor, bu yüzden bazı sonuçlardan sonra 0.1'in de iyi sonuçlar verdiğini ve daha hızlı olduğunu hesaplıyorum. benim bash komut dosyasında ssh problemini çözmek için, bazı makinelere paralel ssh girişini beklemeksizin beklemeden ve geciktirmeden çalışmam, Benim sorumdan bildiğiniz gibi gecikme Linux ve Solaris'e uymalıdır - yael
Hangi çözümü seçerseniz seçin, bir kabuk betiğinin zamanlama açısından çok doğru olmayacağını unutmayın. - scai
Ne yapmak için çok kısa bir zaman alır bir şey yapmak hakkında, ama hiçbir şey yapmaz .. nasıl echo "" >/dev/null - Tom O'Connor
İyi fikir ama bu komut ne kadar msec? , 0.1 msec gerekir, daha az değil - - yael


Cevaplar:


Bash, kesirli saniyeleri destekleyen "yüklenebilir" bir uykuya sahiptir ve harici bir komutun genel giderlerini ortadan kaldırır:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

Sonra:

$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real    0m1.000s
user    0m0.004s
sys     0m0.004s

Dezavantajı, madalyonun sizin bash İkili, bu yüzden onları gösterildiği gibi kendiniz derlemeniz gerekir (Solaris üzerinde olsa da mutlaka yukarıdaki gibi basit olmaz).

İtibariyle bash-4.4 (Eylül 2016) tüm asıl yükler artık, bunları destekleyen platformlarda varsayılan olarak oluşturulur ve yüklenir, ancak bunlar ayrı paylaşılan nesne dosyaları olarak oluşturulurlar ve .so soneki. Dağıtım / İşletim Sisteminiz yaratıcı bir şey yapmadıkça, bunun yerine yapabilmeniz gerekir:

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(Adam sayfası ima eder BASH_LOADABLES_PATH otomatik olarak ayarlandı, bu durumun resmi dağıtımda 4.4.12'den beri olmadığını düşünüyorum. Doğru ayarlandığında ve sadece ihtiyacınız varsa enable -f filename commandname gereğince, gerektiği gibi.)

Bu uygun değilse, yapılacak en kolay şey inşa etmek veya elde etmek sleep GNU coreutils'ten, bu gerekli özelliği destekler. POSIX sleep komut az, eski Solaris sürümleri sadece bunu uyguladı. Solaris 11 sleep  yapar kesirli saniye desteği.

Son çare olarak kullanabilirsiniz perl (veya elinizin altında olması gereken başka bir betik), tercümanın başlatılmasının amaçlanan uyku süresine benzeyebileceği uyarısı ile:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

59
2018-01-15 13:52



Ah, kullandigin icin expect muhtemelen sadece kullanabilirsiniz "after N", N burada milisaniyedir, doğrudan senaryonuzda. - mr.spuratic
kullanım usleep @Luis Vazquez ve @sebix yazmak gibi - Ilan.K


İçin belgeler sleep komutanı coreutils diyor:

Tarihsel uyku uygulamaları bu sayının bir   Tamsayı, ve yalnızca bir sonek olmadan tek bir argümanı kabul etti.   Ancak, GNU uyku keyfi kayan nokta sayılarını kabul eder. Görmek    Kayan nokta.

Böylece kullanabilirsiniz sleep 0.1, sleep 1.0e-1 ve benzer argümanlar.


103
2018-01-15 13:22



SOLARIS OS ile ilgili sözlerimi gör - yael
Sen karıştırdın mı olduğu ve değil? - scai
güncellememi quastion'da gör - yael
Yael, sanırım sorununda hala çok fazla negatif var; "yasadışı sözdizimi" demek istediğinden emin misin? - MadHatter
örneğin - ben solaris 10 üzerinde koşuyorum: # uyku 0.1 uyku: argümanında kötü karakter, linux uyku hakkında 0.1 iyi çalışıyor - yael


Uyku ondalık sayıları kabul eder, böylece bunu aşağıdaki gibi bozabilirsin:

Saniyenin 1 / 2'si

 sleep 0.5

Saniyenin 1 / 100'ü

sleep 0.01

Yani bir milisaniye isterdin

sleep 0.001

46
2018-01-15 13:24



Ondalık noktadan önce de baştaki sıfırı da bırakabilirsiniz. Örneğin. sleep .5 - Mike Causer
Dışında mathforum.org/library/drmath/view/52352.html - stark
Aşırı derecede karmaşık olan herkes hakkında konuşun ... - Martin


Doğruluğu belirlemek için şunu deneyin:

    time sleep 0.5      # 500 milliseconds (1/2 of a second)
    time sleep 0.001    # 1 millisecond (1/1000 of a second)
    time sleep 1.0      # 1 second (1000 milliseconds)

Kombinasyonu mr.spuratic'ın çözümü ve coles çözümü.


11
2018-06-22 19:52





Sadece kullanabilirsiniz usleep. Parametre olarak microseconds (= 1e-6 saniye) alır, böylece gireceğiniz 1 milisaniye uyuyabilirsiniz:

usleep 1000

6
2017-07-08 13:55



$ usleep  No command 'usleep' found, did you mean:  Command 'sleep' from package 'coreutils' (main)  usleep: command not found - Bulletmagnet
Hayır, demek istediğim usleep bir bölümü initscripts En az tüm Red Hat türetilmiş dağılımlarda standart olan paket; En az RHEL, CentOS, Fedora, Mageia / Mandriva ve SuSE dahil. İşte bir örnek: `` ` - Luis Vazquez
İşte CentOS 7'de çalışan örnek bir ilustrasyon: `` `$ usleep / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-9.49.37-1.el7_3.1.x86_64` `Özetle : - sleep (dan coreutils) saniyelerle çalışır - usleep (dan initscripts) mikro saniye ile çalışır - Luis Vazquez


Aynı problemi (Solaris'te uyumayan bir kabuk) vardı, böylece kendi yazımı yazdım:

  #include "stdio.h"
  int main(int argc, char **argv) {
     if(argc == 1) { usleep(atoi(argv[1])); }
     return 0;
}

Argümanları kontrol etmez - Eğer sen tutmak istedim ama (gcc usleep.c -o usleep) bir delikten dışarı alırsınız doğru yazılmış bir tane tavsiye ederim.


3
2018-05-24 15:12



Yapabilirdiniz en azından çıplaklığı değiştir usleep() seslenmek if(argc == 1) { usleep(atoi(argv[1])); } Dizinin sınırlarının dışında indekslenmeyi önlemek için, beklenmedik davranışların herhangi bir sayısına yol açabilir. - α CVn