Cómo encontrar el tiempo de actividad de un proceso de Linux

Cómo encontrar el tiempo de actividad de un proceso de Linux

¿Cómo encuentro el tiempo de actividad de un proceso de Linux determinado?

ps aux | grep gedit | grep -v grep

me da mucha información que incluye el momento en que se inició el proceso. Estoy buscando específicamente un interruptor que devuelva el tiempo de actividad de un proceso en milisegundos.

Gracias

Respuesta1

Como "tiempo de actividad" tiene varios significados, he aquí un comando útil.

ps -eo pid,comm,lstart,etime,time,args

Este comando enumera todos los procesos con varias columnas diferentes relacionadas con el tiempo. Tiene las siguientes columnas:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= ID del proceso
primero COMMAND= solo el nombre del comando sin opciones y sin argumentos
STARTED= el tiempo absoluto en que se inició el proceso
ELAPSED= tiempo transcurrido desde que se inició el proceso (hora del reloj de pared), formato [[dd-]hh:]mm:ss TIME= tiempo de CPU acumulado, "[dd-]hh:mm:ss" formato
segundo COMMAND= nuevamente el comando, esta vez con todas las opciones y argumentos proporcionados

Respuesta2

Si tiene una versión limitada pscomo la que se encuentra en busybox, puede obtener la hora de inicio del proceso mirando la marca de tiempo de /proc/<PID>. Por ejemplo, si el pid que desea ver es 55...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... y luego compararlo con la fecha actual...

# date
Thu May 22 03:00:47 EDT 2014

Respuesta3

Creo que puedes simplemente ejecutar:

$ stat /proc/1234

1234 es la identificación del proceso.

Ejemplo con dos procesos iniciados a la misma hora, minuto, segundo pero no en los mismos milisegundos:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

Respuesta4

¿Una cosa tan simple no tiene una respuesta adecuada después de 5 años?

No creo que puedas obtener milisegundos con precisión. p.ej. Si observa man procfsy ve /proc/$$/statcuál tiene el campo 22 como hora de inicio, que está en "tictacs del reloj", tendría algo más preciso, pero los tics del reloj no van a un ritmo perfectamente constante (en relación con el "tiempo del reloj de pared") y lo harán. Estar fuera... durmiendo y ciertas cosas (ntpd, supongo) lo compensan. Por ejemplo, en una máquina que ejecuta ntpd, con 8 días de actividad y nunca ha dormido, dmesg -Ttiene el mismo problema (creo...), y puedes verlo aquí:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

Aquí los segundos:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

información relacionada