Deseo ejecutar un comando cada 10 segundos y ejecutarlo en segundo plano ( watch
¿ eliminando así ?). Todas las respuestas muestran algo como lo siguiente, pero esto se ejecutará cada 11 a 14 segundos. ¿Cómo se puede lograr esto?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Respuestas:
Qué tal si:
ETA: con todos esos comentarios, alternativas y la subshell para una protección adicional, parece mucho más complicado de lo que comenzó. Entonces, a modo de comparación, esto es lo que parecía antes de comenzar a preocuparme
wait
okill
con su$!
necesidad de aislamiento:El resto es realmente solo para cuando lo necesites.
fuente
$!
: "Se expande al ID de proceso del trabajo colocado más recientemente en el fondo", ysleep
no se coloca en el fondo, por lo que no, no lo hará. :)Usted puede hacer algo como lo siguiente en
bash
,zsh
oksh
:Esto es lo
bash
que dice el manual sobre$SECONDS
:Aquí hay un ejemplo de trabajo:
fuente
SECONDS
hacersleep "$((10-(($SECONDS-$start_time)%10)))"
. Tendrás que hacerstart_time=$SECONDS
antes del bucle.SECONDS
. Generar un sub-shell como en su última edición, también debería evitar este problema.while true
bucle, no pensé que se esperaba que ningún estado shell sobreviviera. Ajustar un bucle como ese en su propio contexto suele ser la mejor práctica, de todos modos. Sin embargo, en una situación así, me preocuparía más hacerlo portrap
el bien que por$SECONDS
el bien.BASH solamente: también puede calcular el tiempo que dedica su comando y restar de 10:
Del hombre BASH:
fuente