sen jest bardzo popularnym poleceniem i możemy zacząć spać od 1 sekundy:
# wait one second please
sleep 1
ale jaka alternatywa, jeśli muszę czekać tylko 0,1 sekundy lub od 0,1 do 1 sekundy?
- Uwaga: na Linuksie lub OS X
sleep 0.XXX
działa dobrze, ale na Solarissleep 0.1
lubsleep 0.01
- Nielegalna składnia
echo "" >/dev/null
Odpowiedzi:
Bash ma „ładowany” sen, który obsługuje ułamkowe sekundy i eliminuje koszty zewnętrzne polecenia:
Następnie:
Minusem jest to, że pliki ładowalne mogą nie być dostarczane z Twoim
bash
plikiem binarnym, więc musisz sam je skompilować, jak pokazano (chociaż w Solarisie nie musi to być tak proste, jak powyżej).Od
bash-4.4
(wrzesień 2016 r.) Wszystkie programy ładujące są teraz budowane i instalowane domyślnie na platformach, które je obsługują, chociaż są one budowane jako osobne pliki obiektów współużytkowanych i bez.so
przyrostka. O ile Twój system / system operacyjny nie zrobił czegoś kreatywnego, powinieneś być w stanie to zrobić:(Strona
BASH_LOADABLES_PATH
podręcznika sugeruje, że jest ustawiana automatycznie, uważam, że nie jest tak w oficjalnej dystrybucji od 4.4.12. Jeśli i kiedy jest ustawiona poprawnie, potrzebujesz tylkoenable -f filename commandname
zgodnie z wymaganiami.)Jeśli to nie jest odpowiednie, następną najłatwiejszą rzeczą jest zbudowanie lub uzyskanie
sleep
z GNU coreutils, obsługuje to wymaganą funkcję. Polecenie POSIXsleep
jest minimalne, starsze wersje systemu Solaris zaimplementowały tylko to. Solaris 11sleep
nie obsługują ułamków sekund.W ostateczności możesz użyć
perl
(lub dowolnego innego skryptu, który masz pod ręką) z zastrzeżeniem, że inicjowanie interpretera może być porównywalne z zamierzonym czasem snu:źródło
expect
, prawdopodobnie możesz po prostu użyć „after N
”, gdzie N to milisekundy, bezpośrednio w skrypcie.usleep
jak @Luis Vazquez i @sebix piszDokumentacja
sleep
polecenia z coreutils mówi:Stąd można użyć
sleep 0.1
,sleep 1.0e-1
i podobne argumenty.źródło
Tryb uśpienia akceptuje liczby dziesiętne, dzięki czemu możesz go podzielić w następujący sposób:
1/2 sekundy
1/100 sekundy
Więc przez milisekundę chciałbyś
źródło
sleep .5
Spróbuj tego, aby określić dokładność:
Połączenie rozwiązania mr.spuratic za i rozwiązania Coles męska .
źródło
Możesz po prostu użyć
usleep
. Jako parametr potrzeba mikrosekund (= 1e-6 sekund), więc aby spać 1 milisekundę, wpisz:źródło
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
częśćinitscripts
pakietu, która jest standardowa przynajmniej we wszystkich dystrybucjach pochodzących od Red Hata; w tym co najmniej RHEL, CentOS, Fedora, Mageia / Mandriva i SuSE. Oto przykład: ``sleep
(z coreutils ) działa z sekundami -usleep
(z skryptów startowych ) działa z mikro-sekundamiMiałem ten sam problem (brak snu w Solarisie), więc napisałem swój w ten sposób:
Nie sprawdza argumentów - polecam poprawnie napisany, jeśli chcesz go zachować, ale to (gcc usleep.c -o usleep) wyciągnie cię z dziury.
źródło
usleep()
połączenie, abyif(argc == 1) { usleep(atoi(argv[1])); }
uniknąć indeksowania poza granicami tablicy, co może prowadzić do dowolnej liczby nieoczekiwanych zachowań.if (argc == 2) { usleep(atoi(argv[1])); }
...usleep
jednostką jest μs, więc aby poczekać 1 sekundę, musisz podać argument 1000000.atoi()
jest okropnym wyborem do konwersji łańcucha naint
. Coatoi( "STRING" )
zwracaatoi()
nie ma możliwości zwrócenia żadnego błędu.Podoba mi się pomysł zasypiania, ale nie mogę pod nim komentować. Ponieważ pomogło mi to, mam nadzieję, że moja sugestia może ulepszyć pomysł na sen.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c to rzeczywisty kod źródłowy usleep.c w ekosystemie redhat.
Spróbuj skompilować to w swoim systemie Solaris. Prawdopodobnie potrzebujesz https://www.opencsw.org/packages/libpopt0/ .
źródło