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

69

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

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

Mahadevan Sreenivasan
fuente

Respuestas:

113

Como "tiempo de actividad" tiene varios significados, aquí hay 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 ( tiempo del reloj de pared ), formato [[dd-] hh:] mm: ss TIME= acumulativo Tiempo de CPU, formato "[dd-] hh: mm: ss"
segundo COMMAND= nuevamente el comando, esta vez con todas sus opciones y argumentos provistos

Abdull
fuente
1
Agradable. Yo prefiero etimesa mí mismo - tiempo transcurrido en segundos - por lo que es legible por máquina
Asfand Qazi
1
la pregunta era sobre el tiempo de la estadística en milisegundos
yohann.martineau
desafortunadamente, busybox 1.29.3 rompió el formato para etime, así que no confíes en él para analizarlo.
Danny Dulai
10

Si tiene una versión limitada de la psque 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
goertzenator
fuente
1
Parece que esto ya no funciona en los núcleos actuales.
Goertzenator
7

Creo que puedes correr:

$ stat /proc/1234

1234 siendo la identificación del proceso.

ejemplo con dos procesos iniciados a la misma hora minuto segundos pero no 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
yohann.martineau
fuente
4

¿Una cosa tan simple no se responde adecuadamente después de 5 años?

No creo que puedas obtener milisegundos con precisión. p.ej. si ve man procfsy ve /proc/$$/statcuál tiene el campo 22 como hora de inicio, que está en "tics de reloj", tendría algo más preciso, pero los ticks de reloj no van a una velocidad perfectamente constante (en relación con el "tiempo de reloj de pared") y 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 puede 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í hay 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"
Peter
fuente
3

Sí, demasiado viejo y aún demasiado duro. Intenté con el método "stat" propuesto anteriormente, pero ¿y si ayer hubiera tocado el directorio de proceso PID? Esto significa que mi proceso de un año se muestra con la marca de tiempo de ayer. No, no es lo que necesito :(

En los más nuevos, es simple:

ps -o etimes -p <PID>
ELAPSED
339521

Tan sencillo como eso. El tiempo está presente en segundos. Haz lo que necesites. Con algunas cajas más antiguas, la situación es más difícil, ya que no hay etimes. Uno podría confiar en:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

que se ven "un poco" raros ya que está en formato dd-hh: mm: ss. No apto para cálculos posteriores. Lo hubiera preferido en segundos, por lo tanto, usé este:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544
George Ivanov
fuente
Esta es una forma realmente agradable de hacerlo en los sistemas más antiguos, gracias :)
RobotJohnny
no analice la salida de etime porque busybox 1.29.3 cambió el formato. use el método stat + / proc en su lugar
Danny Dulai
-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => ID del proceso para el proceso de Java

etimes= => tiempo en segundos y '=' es eliminar el encabezado

Rohit
fuente