¿Hay sustitutos, alternativas o trucos bash para retrasar comandos sin usar sleep
? Por ejemplo, realizar el siguiente comando sin usar el modo de suspensión:
$ sleep 10 && echo "This is a test"
Tienes alternativas a sleep
: Son at
y cron
. Contrariamente a sleep
esto, necesita proporcionar el tiempo en el que necesita que se ejecuten.
Asegúrese de que el atd
servicio se esté ejecutando ejecutándolo service atd status
.
Ahora digamos que la fecha es 11:17 am UTC; si necesita ejecutar un comando a las 11:25 GMT, la sintaxis es: echo "This is a test" | at 11:25
.
Ahora tenga en cuenta que, atd
de forma predeterminada, no se registrará la finalización de los trabajos. Para más información consulte este enlace . Es mejor que su aplicación tenga su propio registro.
Puede programar trabajos en cron
, para más información: man cron
para ver sus opciones o crontab -e
para agregar nuevos trabajos. /var/log/cron
se puede verificar la información sobre la ejecución de trabajos.
FYI sleep system call
suspende la ejecución actual y lo programa con el argumento que se le pasó.
EDITAR:
Como @Gaius mencionó, también puede agregar minutos de tiempo al comando, pero at
digamos que es la hora 12:30:30
y ahora ejecutó el programador now +1 minutes
. A pesar de que se especificó 1 minuto, que se traduce en 60 segundos, at
realmente no espera hasta 12:31:30
ejecutar el trabajo, sino que ejecuta el trabajo en 12:31:00
. Las unidades de tiempo pueden ser minutes, hours, days, or weeks
. Para más consultaman at
p.ej: echo "ls" | at now +1 minutes
Con bash
builtins, puedes hacer:
coproc read -t 10 && wait "$!" || true
Dormir durante 10 segundos sin usar sleep
. El coproc
objetivo es hacer que read
el stdin sea una tubería de la que nunca saldrá nada. || true
es porque wait
el estado de salida reflejará una entrega SIGALRM que provocaría que el shell salga si errexit
se establece la opción.
En otras conchas:
mksh
y ksh93
tienen sleep
incorporado, no tiene sentido usar nada más allí (aunque ambos también son compatibles read -t
).
zsh
también es compatible read -t
, pero también tiene un envoltorio incorporado select()
, por lo que también puede usar:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
Si lo que desea es programar cosas para que se ejecuten desde una sesión de shell interactiva, consulte también el zsh/sched
módulo enzsh
.
read -t 10 < /dev/zero || true
?
read
se implementara usando select (2) o algo similar (lo que implica que leer con tiempo de espera sería una buena respuesta a esta pregunta). Estoy expresando sorpresa en lugar de contradecirlo, pero ¿puede señalar una discusión adicional sobre esto?
/dev/zero
es un archivo que contiene una cantidad infinita de datos (bytes NUL). Entonces read
leerá todo lo que pueda durante esos 10 segundos. Afortunadamente, en el caso de bash
que no sea compatible con el almacenamiento de bytes NUL en sus variables, eso no usará ninguna memoria, pero aún así acaparará los recursos de la CPU.
/dev/stdout
sería el dispositivo tty, por lo que tendría efectos secundarios (como detener el script si se ejecuta en segundo plano) y volvería si el usuario presiona Enter, por ejemplo. read -t 10 /dev/stdout | :
funcionaría en Linux, pero solo en Linux, mientras que coproc
debería funcionar independientemente del sistema operativo.
Algunas otras ideas
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
Dado que hay respuestas que sugieren utilizar la -t delay
opción no estándar de read
, aquí hay una manera de hacer una lectura expirada en un shell estándar:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
El argumento de stty time
está en décimas de segundo.
Usando la variable incorporada bash $SECONDS
y un loop ocupado:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
bash
, zsh
y mksh
tuvo problemas similares, pero se han solucionado desde entonces)
El truco más antiguo del libro:
read && echo "This is a test"
¡Solo golpea Entery continuará!
sleep
) y solicita una alternativa equivalente sin. Así read
que no analiza, lo siento. ;)
--- press «enter» to continue ---
;-)
En los días de los microordenadores que ejecutaban BASIC, los retrasos generalmente se lograban con un bucle vacío:
FOR I = 1 TO 10000:NEXT
El mismo principio podría usarse para insertar un retraso en un script de shell:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Por supuesto, el problema con este enfoque es que la duración del retraso variará de una máquina a otra de acuerdo con la velocidad de su procesador (o incluso en la misma máquina bajo diferentes cargas). A diferencia sleep
, probablemente también maximizará su CPU (o uno de sus núcleos).
No hay una función integrada, que hace lo mismo que sleep
(a menos que sleep
esté integrada). Sin embargo, hay otros comandos que esperarán.
Algunos incluyen.
at
y cron
: se utiliza para programar tareas en un momento específico.
inotifywait
: se usa para esperar un archivo, o archivos para ser modificados / eliminados / agregados / etc.
at
?
cron
almacenar tareas en crontab
, ¿verdad? ¿Dónde at
almacena los datos programados?
Un clásico de la tierra de Windows y lotes:
ping -c 11 localhost >/dev/null && echo "This is a test"
Si desea esperar interactivamente una nueva línea en un archivo, entonces
tail -f
.
¿Esperando un cambio en un sistema de archivos? Entonces use eg
inotify / inoticoming
.
Y hay otras opciones, dependiendo de lo que quiera decir con "esperar".
sleep
?at
podría ser uno, pero no pude encontrar ningún ejemplo de uso.