
¿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 ps
como 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 procfs
y ve /proc/$$/stat
cuá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 -T
tiene 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"