Formatee la salida de cputime para ps

13

Estoy tratando de escribir un script que pueda monitorear el uso de la CPU de un proceso durante un intervalo (para crear un gráfico).

Hasta ahora, este es el comando que estoy usando

ps -p $PROCID -o cputime,etimes

Mi única preocupación es que la salida de cputime parece ser [dd]hh:mm(o algo similar, no puedo recordarlo ahora)

¿Hay alguna forma de formatear cputime en segundos, como etime -> etimes para obtener el tiempo transcurrido en segundos?

Editar: esta es la salida que estoy recibiendo actualmente

2-03:01:33 2653793

Me gustaría que el primer parámetro se formatee en segundos, no en días-horas: minutos: segundos.

dreadiscool
fuente
¿puede agregar la salida que recibe ahora y la salida que desea recibir?
Simply_Me
@Simply_Me He editado la publicación
dreadiscool
@ John1024 Sí, es la cantidad de días.
dreadiscool

Respuestas:

9

Esto convierte la primera vez a segundos:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

Como ejemplo, el comando ps produce:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

El awkcomando procesa eso y devuelve:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

Explicación

  • -F'[: ]+'

    Esto le dice a awk que trate los dos puntos y los espacios como separadores de campo. De esta manera, las horas, minutos y segundos aparecen como campos separados.

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    La inicial /:/restringe el código para trabajar solo en líneas que incluyen dos puntos. Esto elimina las líneas de encabezado. El número de segundos se calcula a partir de horas, minutos, segundos a través de t=$3+60*($2+60*$1). El valor resultante para tse imprime a lo largo del lado con el tiempo transcurrido.

Días de manipulación

Si psproduce días, horas, minutos, segundos, como en:

2-03:01:33

Luego, use este código en su lugar:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

Si los días pueden o no estar antepuestos a la salida, utilice este comando combinado:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'
John1024
fuente
Perdóname si estoy equivocado, pero no se parece a este comando está tomando en cuenta los días, que también puede ser adjuntado al comienzo
dreadiscool
Eso es correcto: mi sistema no mostró días para ningún proceso. Puedo adivinar cómo serían los días, pero ¿puedes dar un ejemplo real?
John1024
2-03: 01: 33 son 2 días, 3 horas, 1 minuto y 33 segundos. Sin embargo, los días no siempre se prefieren. En mi sistema solo se antepone si el proceso ha estado activo durante más de 24 horas. Gracias por su ayuda hasta ahora, por cierto, lo agradezco
dreadiscool
@ user1772510 Respuesta actualizada para manejar días.
John1024
Gracias por toda su ayuda, si pudiera votar también lo haría (no hay suficientes representantes en esta comunidad) ¡Lo agradecería profundamente!
dreadiscool
2

Si no quieres traer awk al juego, una solución bash pura (t_str contiene la cadena formateada, t_sec el tiempo decodificado en segundos):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi
Nicolas Breton
fuente
0

No especifica para qué sistema operativo es; si es Linux, y dado que está interesado en monitorear un proceso específico, puede que le resulte más útil analizarlo /proc/$PROCID/stat; consulte la proc(5)página del manual para obtener más detalles.

Toby Speight
fuente