Formate a saída de cputime para ps

12

Estou tentando escrever um script que pode monitorar o uso da CPU de um processo por 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 semelhante, não consigo me lembrar da cabeça agora)

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

Edit: Esta é a saída que estou recebendo no momento

2-03:01:33 2653793

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

dreadiscool
fonte
você pode adicionar a saída que você recebe agora e a saída que deseja receber?
Simply_Me
@Simply_Me Eu editei a publicação
dreadiscool
@ John1024 Sim, é a quantidade de dias.
dreadiscool

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 awkcomando 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'[: ]+'

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

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

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

Dias de manipulação

Se psproduz 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 puderem ou não ser anexados à 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}'
John1024
fonte
Perdoe-me se estou enganado, mas não parece que este comando está levando em conta dias, o que também pode ser prefixado
dreadiscool
Isso está correto: meu sistema não mostrou dias para nenhum processo. Posso adivinhar como seriam os dias, mas você pode fornecer um exemplo real?
precisa saber é o seguinte
2-03: 01: 33 são 2 dias, 3 horas, 1 minuto e 33 segundos. Porém, os dias nem sempre são anexados. No meu sistema, apenas é anexado se o processo estiver ativo por mais de 24 horas. Obrigado por sua ajuda até agora, eu agradeço
dreadiscool
@ user1772510 Resposta atualizada para lidar com os dias.
precisa saber é o seguinte
Obrigado por toda a sua ajuda, se eu pudesse votar, eu também votaria (não há representante suficiente nesta comunidade) Agradeço profundamente!
Dreadiscool
2

Se você não deseja trazer awk no jogo, uma solução pura para o bash (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
Nicolas Breton
fonte
0

Você não especifica para qual sistema operacional é; se for Linux, e se você estiver interessado em monitorar um processo específico, talvez seja mais interessante analisá-lo /proc/$PROCID/stat- consulte a proc(5)página do manual para obter detalhes.

Toby Speight
fonte