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 210mes 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'muchasshimplementaciones, es el mismo proceso que se ejecutashy luego se ejecutasleep 2(1 segundo después).exec). Pero ese es un buen punto para cualquier solución general.mkshyksh93al menos) tienensleepincorporados (por lo que no aparecerían enps), necesitaría saber de antemano con quésleepimplementaciones está tratando.Respuestas:
Admite
sleepargumentos 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 enetimelugar deetimescomo eso es más portátil (Unix estándar).(el
s/\?//ges deshacerse de los?caracteres queprocps'psusa como reemplazo para los caracteres de control. Sin él, no se analizaríasleep $'\r1d'osleep $'\t1d'... Desafortunadamente, en algunas configuracionesCregionales, 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\t5dentre un.5d(medio día)).Pase el pid como argumento.
Eso también supone que el
argv[0]pasado asleepno 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:]SSsalida en lugar de solo el número de segundos, reemplace elprint $tcon:fuente
0xffp-6d... Ahora, ese es un caso de prueba! Pero en realidad el sueño GNU también toma cosassleep 1h 30masí ...sleep 1h -1mqué 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.sleepde pausa. Incluso podría mostrar un valor negativo en este caso.remaining_sleep_time 12838regresó-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.5dosleep 1e5osleep infinity). Cambiar debashun shell que admite puntos flotantes como zsh, ksh93 o yash ayudaría. No, esoetimesno es portátil.perlEsto 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'syschedelatcomando 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