¿Existe una manera de comprobar cuánto tiempo le queda a un proceso "dormido" en ejecución antes de que termine dentro de la terminal?
Respuestas
¿Demasiados anuncios?El comando de sueño en sí mismo no ofrece ningún servicio que permita controlar el tiempo de sueño restante. Tampoco se muestra en ninguna parte.
Como el comando sleep opera sin emitir una serie de llamadas al sistema para el kernel, tampoco podrás utilizar una herramienta de depuración típica como dtruss. Si intentas utilizar el depurador lldb para adjuntarte al proceso, verás que el comando sleep también se interrumpe y no puede continuar.
Por lo tanto, no es posible determinar con precisión la cantidad de tiempo que queda. Si puedes conformarte con un resultado impreciso, haz lo siguiente:
Primero ejecuta este comando:
ps xa | grep sleep
Esto debería mostrarte el comando sleep con el número de segundos que se supone que duerme en total. Por ejemplo:
1234 s0123 S+ 0:00.01 sleep 789
Aquí 789 es el número de segundos que el comando debe dormir en total.
A continuación, ejecute este comando:
ps xa -o etime,command -c | grep sleep
Le mostrará el tiempo total que ha estado funcionando el proceso:
03:15 sleep
Esto significa que el proceso ha dormido durante 3 minutos y 15 segundos = 195 segundos. El tiempo de reposo restante es de 789 - 195 = 594 segundos.
Si su versión de ps
soporta etimes
( etime
en segundos ) (lamentablemente no es compatible con MacOS), puede utilizarlo para calcular el tiempo restante:
ps xa -o etimes,command | awk '/[s]leep/ {print "time remaining for", $2, "is", $3 - $1, "seconds"}'
Ejemplo de salida:
time remaining for sleep is 94 seconds
O se puede simplificar para que sólo aparezca el número:
ps xa -o etimes,command | awk '/[s]leep/ {print $3 - $1}'
Estos comandos mostrarán más de una línea si hay más de una sleep
proceso se está ejecutando.
Nota: Ni el etime
ni etimes
emite segundos fraccionarios, pero sleep
puede aceptarlos como argumento. Esto probablemente afectará a la precisión de su cálculo.
Para MacOS y otros sin etimes
, puede convertir etime
( ddd-hh:mm:ss
) a segundos invirtiendo los cálculos realizados en la fuente de ps
(en print.c
):
ps xa -o etimes,command | awk '
BEGIN {
f = "1 60 3600 86400";
split(f, factors)
}
/[s]leep/ {
split($1, parts, "[-:]");
count = length(parts);
for (i = count; i > 0; i--) {
e += parts[i] * factors[count + 1 - i]
};
print e;
e = 0
}'