Desejo executar um comando a cada 10 segundos e executá-lo em segundo plano (eliminando assim watch
?). Todas as respostas mostram algo como o seguinte, mas isso será executado a cada 11 a 14 segundos. Como pode ser isto alcançado?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Respostas:
E se:
ETA: Com todos esses comentários, alternativas e o subshell para proteção extra, isso parece muito mais complicado do que começou. Então, para comparação, veja como era antes de eu começar a me preocupar com ,
wait
oukill
com a$!
necessidade deles de isolamento:O resto é realmente apenas para quando você precisar.
fonte
$!
: "Expande para a identificação do processo da tarefa colocada mais recentemente em segundo plano" esleep
não é colocada em segundo plano; portanto, não. :)Você pode fazer algo como o seguinte em
bash
,zsh
ouksh
:Aqui está o que o
bash
manual diz sobre$SECONDS
:Aqui está um exemplo de trabalho:
fonte
SECONDS
dosleep "$((10-(($SECONDS-$start_time)%10)))"
. Você terá que fazerstart_time=$SECONDS
antes do loop.SECONDS
. Desovar um sub-shell como em sua edição mais recente também deve evitar esse problema.while true
loop, eu não imaginava que nenhum estado de shell pudesse sobreviver a ele. Em qualquer caso, agrupar um loop como esse em seu próprio contexto geralmente é uma prática recomendada. Em uma situação como essa, eu estaria mais preocupado em fazê-lo portrap
causa do que por$SECONDS
causa, no entanto.Somente BASH - Você também pode calcular o tempo gasto pelo seu comando e subtrair de 10:
Do BASH man:
fonte