Publi

Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux

Bash tiempo proceso
¡Una nueva sección! Después de tanto tiempo y tantas secciones inacabadas. Algo que tenía ganas de hacer, es crear posts con esa serie de recetas, scripts, oneliners, o píldoras que se me van ocurriendo mientras trabajo en consola. Suelen ser cosas pequeñas y deberían caber en un tweet junto con una pequeña descripción. De todas formas a mí me gusta explicar un poco más las cosas para que quede bien claro.

En este caso, vamos a empezar conociendo el tiempo que lleva abierto un proceso, o un programa. Puede ser una información útil si, por ejemplo, tenemos corriendo servicios que ante un problema se reinician solos. O porque simplemente queremos saber ese dato, al igual que: ¿cuánto tiempo llevo con el ordenador encendido? que podemos responder con uptime. En este caso queremos saber cuánto tiempo llevo con un programa arrancado, como puede ser firefox, spotify, chrome, o apache.

Al grano

Vamos a poner dos métodos que iré explicando más adelante:

pid=$(pidof firefox); s=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); echo $(date -ud “@$s” +”$(($s/86400)) dias %Hh:%Mm:%Ss”)
1 dias 23h:39m:24s

O de una forma más corta, podemos utilizar

ps -eo pid,etime,comm | grep firefox
24441  1-23:53:14 firefox

Donde veremos primero el PID, luego el tiempo y luego el nombre del proceso.

Explicando el primero

En el primer ejemplo, lo primero que hacemos es coger el ID del proceso (PID).

pid=$(pidof firefox)

Tras ello, sacaremos la fecha y hora en formato UNIX del momento actual (como siempre, esto será el número de segundos desde el 1 de Enero de 1970 a las 00:00).
date +%s

Luego consultaremos la fecha del directorio /proc/PID y la pondremos en formato UNIX también. Recordemos que todos los procesos tendrán un directorio virtual en /proc/ con información sobre los mismos.
stat -c %Y /proc/”$pid

El objetivo es restar las dos fechas, así obtenemos el número de segundos transcurridos desde que se inició el proceso. .
s=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); echo $s

Ahora sólo queda ponerlo en un formato más humano, es decir, en días, horas, minutos y segundos. Para ello, el número de días lo podemos sacar a mano, ya que sería $s (el número de segundos) dividido entre 86400 (los segundos que tiene un día). Pero el resto se lo podemos pedir al comando date. Lo hacemos así porque date presenta fechas y horas (1 de Enero de 2017 a las 12:34:45) no tiempos transcurridos (120 días 3 horas, 4 minutos, 5 segundos), aunque la hora actual es lo mismo que pedir el tiempo transcurrido desde las 00:00.
Podríamos también calcular todos los elementos a mano (días, horas, minutos y segundos), el problema es que el script ya no entraba en un tweet:

pid=$(pidof firefox); secs=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); printf ‘%d days %dh:%dm:%ds\n’ $(($secs/86400)) $(($secs%86400/3600)) $(($secs%3600/60)) $(($secs%60))
1 dias 23h:39m:24s

El segundo ejemplo, con ps

Este segundo ejemplo, será mucho más portable entre sistemas UNIX, y mucho más corto, es verdad, pero no nos da mucho juego a la hora de escoger el formato de salida. El formato del tiempo será fijo (días-horas:minutos:segundos) y será importante visualizar el PID o el nombre del proceso.
Además, es mucho más lento, ya que con ps estamos analizando el tiempo de todos los procesos del sistema, aunque luego en pantalla sólo mostremos el que nos interesa porque la salida de ps la hemos pasado por grep.

También podría interesarte...

There are 4 comments left Ir a comentario

  1. Pingback: Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux | PlanetaLibre /

  2. Pedro /
    Usando Mozilla Firefox Mozilla Firefox 54.0 en Linux Linux

    pidof devuelve más de un PID si hay varios procesos abiertos. Mejor así: for pid in $(pidof firefox); do s=$(($(date +%s)-$(stat -c %Y /proc/$pid))); echo $pid: $(date -ud “@$s” +”$(($s/86400)) dias %Hh:%Mm:%Ss”) ; done

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 54.0 en Ubuntu Linux Ubuntu Linux

      Muy cierto, pidof tal vez nos devuelva más de una PID. Gracias por la puntualización.

      Lo malo es que con un for ya no me cabe la píldora en un tweet 🙂

  3. Pingback: Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux – Poesía Binaria – ProyectoTicTac /

Leave a Reply