Para estar un poco más cerca del código original, lo que hago es:
while true; do
sleep 1 &
...your stuff here...
wait # for sleep
done
Esto cambia un poco la semántica: si sus cosas tomaron menos de un segundo, simplemente esperará a que pase el segundo completo. Sin embargo, si sus cosas tardan más de un segundo por cualquier motivo, no seguirá generando aún más subprocesos sin un final.
Por lo tanto, sus cosas nunca se ejecutan en paralelo y no en segundo plano, por lo que las variables funcionan como se esperaba
Tenga en cuenta que si también inicia tareas en segundo plano adicionales, tendrá que cambiar las wait
instrucciones para esperar solo el sleep
proceso específicamente.
Si necesita que sea aún más preciso, probablemente solo tenga que sincronizarlo con el reloj del sistema y suspender ms en lugar de segundos completos.
¿Cómo sincronizar con el reloj del sistema? No tengo idea realmente, intento estúpido:
Defecto:
while sleep 1
do
date +%N
done
Salida: 003511461 010510925 016081282 021643477 028504349 03 ... (sigue creciendo)
Sincronizado:
while sleep 0.$((1999999999 - 1$(date +%N)))
do
date +%N
done
Salida: 002648691 001098397 002514348 001293023 001679137 00 ... (permanece igual)
sched(7)
API (POSIX: ver<sched.h>
y páginas enlazadas desde allí), básicamente no puede tener garantías en tiempo real de este formulario.