¡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.
Tabla de contenidos
Al grano
Vamos a poner dos métodos que iré explicando más adelante:
O de una forma más corta, podemos utilizar
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).
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).
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.
El objetivo es restar las dos fechas, así obtenemos el número de segundos transcurridos desde que se inició el proceso. .
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:
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.
Pingback: Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux | PlanetaLibre /
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
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 🙂
Pingback: Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux – Poesía Binaria – ProyectoTicTac /
Es supermolesto que esten las frases borrandose y escribiendose todo el rato… ni siquiera soy capaz de concentrarme con esta ventana abierta.
Una pena porque parece interesante lo que cuentas.