Formata a saída do cputime para ps

12

Estou tentando escrever um script que possa monitorar o uso da CPU de um processo durante um intervalo (para criar um gráfico).

Até agora, este é o comando que estou usando

ps -p $PROCID -o cputime,etimes

Minha única preocupação é que a saída do cputime pareça ser [dd]hh:mm (ou algo similar, não consigo lembrar do topo da minha cabeça agora)

Existe uma maneira de formatar o cputime em segundos, como etime - > etimes para obter o tempo decorrido em segundos?

Editar: esta é a saída que estou recebendo atualmente

2-03:01:33 2653793

Eu gostaria que o primeiro parâmetro fosse formatado em segundos, não em dias-horas: minutos: segundos.

    
por dreadiscool 20.09.2014 / 23:04

3 respostas

9

Isso converte a primeira vez em segundos:

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

Como exemplo, o comando ps produz:

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

O comando awk processa isso e retorna:

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

Explicação

  • -F'[: ]+'

    Isto diz ao awk para tratar os dois pontos e espaços como separadores de campo. Desta forma, as horas, minutos e segundos aparecem como campos separados.

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

    O /:/ inicial restringe o código a funcionar apenas em linhas que incluam dois pontos. Isso remove as linhas de cabeçalho. O número de segundos é calculado a partir de horas, minutos e segundos por meio de t=$3+60*($2+60*$1) . O valor resultante para t é então impresso ao lado do tempo decorrido.

Dias de manuseio

Se ps produzir dias, horas, minutos, segundos, como em:

2-03:01:33

Em seguida, use este código:

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

Se os dias podem ou não ser prefixados à saída, use este comando de combinação:

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}'
    
por 20.09.2014 / 23:34
2

Se você não quiser trazer o awk no jogo, uma solução pura (t_str contém a string formatada, t_sec o tempo decodificado em 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
    
por 17.06.2015 / 15:37
0

Você não especifica para qual sistema operacional isso é; Se é Linux, e dado que você está interessado em monitorar um processo específico, você pode achar mais interessante analisar /proc/$PROCID/stat - veja a página de manual proc(5) para detalhes.

    
por 02.07.2015 / 18:36