sleep é um comando muito popular e podemos iniciar o sono a partir de 1 segundo:
# wait one second please
sleep 1
mas qual a alternativa se eu precisar esperar apenas 0,1 segundo ou entre 0,1 a 1 segundo?
- observação: no linux ou no OS X
sleep 0.XXX
funciona bem, mas no solarissleep 0.1
ousleep 0.01
- sintaxe ilegal
A documentação do
sleep
comando do coreutils diz:Portanto, você pode usar
sleep 0.1
,sleep 1.0e-1
e argumentos semelhantes.O Bash tem um sono "carregável" que suporta segundos fracionários e elimina as sobrecargas de um comando externo:
Então:
A desvantagem é que os carregáveis podem não ser fornecidos com seu
bash
binário, então você precisaria compilá-los você mesmo como mostrado (embora no Solaris não seja necessariamente tão simples quanto acima).A partir de
bash-4.4
(setembro de 2016), todos os carregáveis agora são compilados e instalados por padrão em plataformas que o suportam, embora sejam compilados como arquivos de objetos compartilhados separados e sem.so
sufixo. A menos que sua distro/SO tenha feito algo criativo (infelizmente, RHEL/CentOS 8 compiladobash-4.4
com extensões carregáveis removidas deliberadamente ), você deve poder fazer:(A página man implica
BASH_LOADABLES_PATH
que é definida automaticamente, acho que esse não é o caso na distribuição oficial a partir de 4.4.12. Se e quando estiver definido corretamente, você precisará apenasenable -f filename commandname
do necessário.)Se isso não for adequado, a próxima coisa mais fácil a fazer é compilar ou obter
sleep
do GNU coreutils, isso suporta o recurso necessário. O comando POSIXsleep
é mínimo, as versões mais antigas do Solaris implementaram apenas isso. O Solaris 11sleep
oferece suporte a segundos fracionários.Como último recurso, você pode usar
perl
(ou qualquer outro script que tenha à mão) com a ressalva de que inicializar o interpretador pode ser comparável ao tempo de suspensão pretendido:Sleep aceita números decimais para que você possa dividi-lo assim:
1/2 de segundo
1/100 de segundo
Então por um milissegundo você iria querer
Tente isto para determinar a precisão:
Combinação de solução de mr.spuratic e solução de coles .
Você pode simplesmente usar
usleep
. Leva microssegundos (= 1e-6 segundos) como parâmetro, então para dormir 1 milissegundo você digitaria:Eu tive o mesmo problema (sem shell usleep no Solaris), então escrevi o meu assim:
Não verifica argumentos - eu recomendaria um escrito corretamente se você quisesse mantê-lo, mas isso (gcc usleep.c -o usleep) o tirará de um buraco.
Eu gosto da ideia do usleep, mas não posso fazer um comentário sobre ela. Como isso me ajudou, espero que minha sugestão possa melhorar a ideia do usleep.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c é o código fonte real para usleep.c no ecossistema redhat.
Tente compilar isso no seu Solaris. Você provavelmente precisaria de https://www.opencsw.org/packages/libpopt0/ .
A especificação POSIX para
sleep
aceita apenas um argumento integral -- portanto, não há frações de segundo. O coreutilssleep
do GNU adiciona suporte para números reais, sufixos, até notação científica einf
inity como extensões GNU . Mas se você estiver em um sistema embarcado combusybox
ou simplesmente não tiver coreutils, estará sem sorte, a menos que tenha perl.