¿Cómo obtener la hora de inicio de un proceso Linux de larga ejecución? [cerrado]

250

¿Es posible obtener la hora de inicio de un antiguo proceso en ejecución? Parece que psinformará la fecha (no la hora) si no se inició hoy, y solo el año si no se inició este año. ¿Se pierde para siempre la precisión de los viejos procesos?

ajwood
fuente
16
¿Hay algo malo con el uso ps -p <pid> -o lstart? Parece que funciona, pero no estoy seguro de por qué no es la respuesta obvia inmediata para las muchas veces que esta pregunta parece surgir.
ajwood
77
@ajwood Sería mejor usarlo ps -p <pid> -o lstart=para evitar que se imprima una línea adicional (encabezado).
Vladimir Protasov
2
¿Hay algo malo con el uso ps -p <pid> -o lstart? ¿Quizás el hecho de que no haya lstartni en la Edición 2004 ni en la Edición 2013 del estándar POSIX 1003.1?
Piotr Dobrogost
55
@PiotrDobrogost, eso sería un problema si la pregunta se hiciera sobre POSIX, pero se trata de Linux.
womble el
44
Mods - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - ¿por qué no lo mueves a un sitio más apropiado como StackExchange o Superuser en lugar de cerrar la pregunta? Esta es una buena y útil pregunta
Hanxue

Respuestas:

392

Puede especificar un formateador y usar lstart, como este comando:

ps -eo pid,lstart,cmd

El comando anterior generará todos los procesos, con formateadores para obtener PID, ejecución del comando y fecha + hora de inicio.

Ejemplo (de la línea de comando de Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Puede leer la página de manualps o consultar la página de Opengroup para ver los otros formateadores.

wkl
fuente
3
@ bobbyrne01: cambie el orden, por ejemplo, pid, etime, cmd funciona para mí en Debian Wheezy.
exic
1
@Gobliins: etimees el tiempo transcurrido desde que se inició el proceso.
wkl
44
para completar, para aquellos acostumbrados a la sintaxis BSD: ps axo pid,cmd,lstarttambién funciona
Graeme Moss
2
@ bobbyme01: use la opción -ww
Ed Randall
1
Tenga en cuenta que el lstarttiempo puede cambiar, los statmétodos a continuación son más seguros: unix.stackexchange.com/questions/274610/… .
slm
43

El comando ps (al menos la versión procps utilizada por muchas distribuciones de Linux) tiene una serie de campos de formato que se relacionan con la hora de inicio del proceso, incluida la lstartque siempre proporciona la fecha y hora completas de inicio del proceso:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Para una discusión sobre cómo se publica la información en el sistema de archivos / proc, consulte /unix/7870/how-to-check-how-long-a-process-has-been-running

(En mi experiencia con Linux, la marca de tiempo en los directorios / proc / parece estar relacionada con un momento en el que se accedió recientemente al directorio virtual en lugar de la hora de inicio de los procesos:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Tenga en cuenta que en este caso ejecuté un comando "ps -p 1" aproximadamente a las 16:50, luego generé un nuevo shell bash, luego ejecuté el comando "ps -p 1 -p $$" dentro de ese shell poco después ... .)

Nathan
fuente
Para ver cada proceso (no solo el suyo) agregue un argumento e( pssintaxis estándar ) o ax(sintaxis BSD) al comando ps: es decir, ps -ewo pid,lstart,cmdops -axwo pid,lstart,cmd
Ryan Griffith
15

Como seguimiento a la respuesta de Adam Matan , la /proc/<pid>marca de tiempo del directorio como tal no es necesariamente directamente útil, pero puede usar

awk -v RS=')' 'END{print $20}' /proc/12345/stat

para obtener la hora de inicio en el reloj desde el inicio del sistema. 1

Esta es una unidad un poco difícil de usar; vea también convertir jiffies a segundos para más detalles.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

Esto debería darle segundos, que puede pasar strftime()para obtener una marca de tiempo (legible para humanos o de otro modo).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Actualizado con algunas correcciones de Stephane Chazelas en los comentarios; ¡Gracias como siempre!

Si solo tienes Mawk, tal vez intente

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 hombre proc ; busca la hora de inicio .

tripleee
fuente
Ligeramente refactorizado para uso de producción: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee
1
Tenga en cuenta que strftime()y systime()no están presentes mawk, que es el valor predeterminado awken mis imágenes de Debian 8 VPS, por lo que solo puedo suponer que son específicas gawkdel dialecto.
ssokolow
13
ls -ltrh /proc | grep YOUR-PID-HERE

Por ejemplo, el PID de mi Google Chrome es 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583
Adam Matan
fuente
66
Esto no funciona para mí: imprime el tiempo de modificación (cambia con frecuencia) Tal vez por esto: unix.stackexchange.com/questions/20460/…
user920391
La marca de tiempo de / proc / <pid> no es confiable.
Henning
1
Esto regresó un tiempo 9 minutos más tarde que cuando un proceso sobre el que tengo información realmente había comenzado.
Dan Dascalescu
1
Esta parece ser mi única opción que funciona, aunque quizás no sea confiable. Estoy en un sistema integrado que solo tiene busybox psque dice invalid optiontodas las opciones mencionadas por otras respuestas.
Qi Fan
77
¿Por qué grep? ¿Por qué no ls -ldh /proc/$pid? O incluso mejor date -r /proc/$pid?
César
6
 ps -eo pid,etime,cmd|sort -n -k2
bash-o-logist
fuente
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Desbordamiento de pila
fuente
1
Esto también incluirá su propio proceso
Paul Verschoor