Si estoy ejecutando un proceso largo, ¿hay alguna forma de ejecutar algunos comandos basados en el tiempo?
Por ejemplo, estoy ejecutando un proceso realmente largo que dura aproximadamente 10 minutos.
Después de 5 minutos, me gustaría ejecutar un comando por separado. Por ejemplo, el comando separado podría ser:echo 5 minutes complete
(Nota: no quiero avanzar hacia la finalización del comando, sino simplemente comandos ejecutados después de intervalos especificados).
¿Es posible?
shell-script
shell
delay
Aniket Bhattacharyea
fuente
fuente
longcommand & sleep 300 && command-to-do-after-five-minutes
? (En realidad, eso es probablemente lo que está buscando). Tenga en cuenta que su aclaración no fue suficiente, ya que obtuvo dos implementaciones de barra de progreso de reloj desde el principio.Respuestas:
Solo corre:
El
do-this-after-five-minutes
se ejecutará después de cinco minutos. Ellong-command
se ejecutará en segundo plano.fuente
sleep 5m && foobar
, así que si cambio de opinión y ^ Csleep
, el siguiente comando no se ejecuta.sleep 3; ls
y^C
, el segundo comando no se ejecuta de todos modos. ¿No estoy seguro de por qué y tal vez funciona de manera diferente en un shell no interactivo?sleep 5m && echo
está durmiendo, cuando suspende, solo se suspende elsleep
comando. El resto de la línea de comando se ejecuta, pero desde quesleep
se suspendió, no salió con éxito y&&
se omite la parte posterior . Intenta suspendersleep 5 || echo hello
yhello
aparece directamente después de presionar^Z
.at(1)
, para cosas comosleep 30m && mplayer something.mp3
recordatorio de alarma o parasleep 90m && fg
reanudar un comando intensivo en disco más tarde. Entonces, en realidad,sleep 5m && echo hello
es bueno porque se^Z
suspendesleep
sin ejecutar el siguiente comando. Si desea poder suspender / reanudar todo el comando compuesto, incluso antes de que salga el sueño, use( sleep 2 && echo hello )
.&&
modismo le permite estar absolutamente seguro de que no cancela el proceso justo después de que se ejecute el sueño (porque no puede^Z
ejecutar el comando, en lugar de arriesgarse a^C
). Esto es útil en lasleep && fg
osleep && bg
el uso de los casos, cuando el ser reanudó comando es parte del camino a través de algo lento.Podrías usar este script:
Ejecuta su
longprocess
ensub-shell
ay luego monitorea la existencia del archivo 'lock' previamente creado.fuente
man bash
paraSECONDS
. Se puede establecerSECONDS=0
en el arranque de la escritura y sólo comprobar si hay mayor o igual a 300 o el conjuntoSECONDS=$((date +%s))
y olvidarse de usardate
de nuevo en el script ...sleep 1s
estar siempre exactamente un segundo más tarde que antessleep 1s
... entonces has sido víctima de falsedades que los programadores creen sobre el tiempo . (Aunque en este caso, también podría mostrar una barra de progreso de marca hash o algo así).sleep
en absoluto!SECONDS
! :)Hay una línea para esto:
En su caso, TIMEOUT = 5m y COMMAND es el comando largo.
También vea mi respuesta a esta publicación Tiempo de espera con 'reinicio de red de servicio'
fuente
jobs %1
falla una vez que el trabajo% 1 se ha detenido.Tenga en cuenta que para tiempos más largos, $ segundos pueden no estar sincronizados con el tiempo real. Es mejor almacenar la hora de inicio y calcular la diferencia con la hora real.
fuente