Yo tengo:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
funcionando como un temporizador simple y sin lujos para recordarme cuándo se debe hacer algo. Eso sleep 210m
es PID 25347.
Estoy tratando de averiguar cuánto tiempo queda en el sueño. Lo mejor que se me ocurrió, y puse la cantidad de sueño original (210 minutos) es:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Explicación: el primer bit calcula el número de segundos en la suspensión original; el $(ps…)
bit obtiene el tiempo desde que la suspensión comenzó en segundos, luego el resto los resta y se muestra en minutos y segundos).
Se me ocurre que esto sería útil en general; ¿Hay una mejor manera de hacer esto? ¿O al menos una forma inteligente de analizar el tiempo de sueño ps -o args
?
sh -c 'sleep 1; sleep 2'
muchassh
implementaciones, es el mismo proceso que se ejecutash
y luego se ejecutasleep 2
(1 segundo después).exec
). Pero ese es un buen punto para cualquier solución general.mksh
yksh93
al menos) tienensleep
incorporados (por lo que no aparecerían enps
), necesitaría saber de antemano con quésleep
implementaciones está tratando.Respuestas:
Admite
sleep
argumentos GNU o Solaris 11 (una o más<double>[smhd]
duraciones, por lo que también funcionaría con implementaciones tradicionales que admitan solo un número entero decimal (como en FreeBSD), pero no con aquellos que aceptan argumentos más complejos como las duraciones ISO-8601 ). Usar enetime
lugar deetimes
como eso es más portátil (Unix estándar).(el
s/\?//g
es deshacerse de los?
caracteres queprocps
'ps
usa como reemplazo para los caracteres de control. Sin él, no se analizaríasleep $'\r1d'
osleep $'\t1d'
... Desafortunadamente, en algunas configuracionesC
regionales, incluida la configuración regional, se usa en.
lugar de?
. No hay mucho que podamos hacer en ese caso, ya que no hay forma de distinguir\t5d
entre un.5d
(medio día)).Pase el pid como argumento.
Eso también supone que el
argv[0]
pasado asleep
no contiene espacios en blanco y que el número de argumentos es lo suficientemente pequeño como para que no se truncaps
.Ejemplos:
Para una
[[[ddd-]HH:]MM:]SS
salida en lugar de solo el número de segundos, reemplace elprint $t
con:fuente
0xffp-6d
... Ahora, ese es un caso de prueba! Pero en realidad el sueño GNU también toma cosassleep 1h 30m
así ...sleep 1h -1m
qué funciona en Solaris 11 pero no con GNUsleep
. De vuelta al tablero de dibujo. Al menos no es compatible con las duraciones iso8601 como ksh93, que sería mucho más difícil.sleep
de pausa. Incluso podría mostrar un valor negativo en este caso.remaining_sleep_time 12838
regresó-40642
. Puede estar en "Pausa" como dice @rush, pero ¿no está seguro de cómo depurar?Esto parecía un problema divertido de resolver; dado que thrig cubría una opción de perl, aquí hay un script bash que hace algo similar. No realiza suficientes verificaciones de errores (supone que está pasando un PID válido de un comando de suspensión). Maneja la misma sintaxis que el núcleoutils sleep de GNU , a saber:
fuente
sleep 0.5d
osleep 1e5
osleep infinity
). Cambiar debash
un shell que admite puntos flotantes como zsh, ksh93 o yash ayudaría. No, esoetimes
no es portátil.perl
Esto podría hacerse mejor con un script que puede mostrar el tiempo restante cuando se aplica una señal
QUIT
(generalmente control+\)INFO
.fuente
zsh
'sysched
elat
comando para otro enfoque que permita consultar la hora.Debería ser bastante fácil con el módulo tqdm python.
Muestra una buena barra de progreso visual y se puede usar como una tubería de Unix.
https://pypi.python.org/pypi/tqdm
El siguiente fragmento de Python cuenta 100 segundos
55% | ██████████ | 55/100 [00:55 <00:45, 1.00s / it]
fuente