Como verificar quanto tempo um processo está sendo executado?

213

Eu gostaria de evitar isso iniciando o processo a partir de um aplicativo de monitoramento.

    
por Tshepang 22.02.2011 / 22:14

8 respostas

271

No Linux com o ps de procps(-ng) (e a maioria dos outros sistemas, desde que isso seja especificado pelo POSIX):

ps -o etime= -p "$$" 

Onde $$ é o PID do processo que você deseja verificar. Isso retornará o tempo decorrido no formato [[dd-]hh:]mm:ss .

Usando -o etime informa ps que você quer apenas o campo de tempo decorrido, e = no final disso suprime o cabeçalho (sem, você recebe uma linha que diz ELAPSED e depois a hora em a próxima linha, com, você recebe apenas uma linha com o tempo).

Ou, com versões mais recentes do conjunto de ferramentas procps-ng (3.3.0 ou superior) no Linux ou no FreeBSD 9.0 ou superior (e possivelmente outras), use:

ps -o etimes= -p "$$"

(com um s adicionado) para obter o tempo formatado como segundos, o que é mais útil em scripts.

No Linux, o programa ps obtém isso de /proc/$$/stat , em que um dos campos (veja man proc ) é a hora de início do processo. Isto é, infelizmente, especificado para ser o tempo em jiffies (um contador de tempo arbitrário usado no kernel do Linux) desde a inicialização do sistema. Então você tem que determinar a hora em que o sistema inicializou (a partir de /proc/stat ), o número de jiffies por segundo neste sistema, e então fazer as contas para obter o tempo decorrido em um formato útil.

Acontece que é ridiculamente complicado encontrar o valor de HZ (isto é, jiffies por segundo). Dos comentários em sysinfo.c no pacote procps, pode-se incluir o arquivo de cabeçalho do kernel e recompilar se um kernel diferente for usado, B) usar a função posix sysconf() , que, infelizmente, usa um valor codificado compilado na biblioteca C, ou C) pergunte ao kernel, mas não há uma interface oficial para fazer isso. Portanto, o código ps inclui uma série de kludges pelos quais ele determina o valor correto. Uau.

Portanto, é conveniente que ps faça tudo isso por você. :)

Como o usuário @ 336_ observa, no Linux (isso não é portátil), você pode usar o comando stat para examinar as datas de alteração de acesso, modificação ou status do diretório /proc/$$ (onde novamente $$ é o processo de interesse). Todos os três números devem ser os mesmos, então

stat -c%X /proc/$$

lhe dará o tempo que o processo $$ começou, em segundos desde a época. Isso ainda não é exatamente o que você quer, já que você ainda precisa fazer as contas para subtrair isso do tempo atual para obter o tempo decorrido - acho que algo como date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" funcionaria, mas é um pouco desajeitado. Uma vantagem possível é que, se você usar a saída em formato longo como -c%x em vez de -c%X , obterá uma resolução maior que o número inteiro em segundos. Mas, se você precisar disso, provavelmente deve usar a abordagem de auditoria de processos porque o tempo de execução do comando stat interferirá na precisão.

    
por 22.02.2011 / 22:20
31

Portátil:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

i.e. esse shell foi iniciado em 30 de janeiro e totalizou cerca de 6 segundos de tempo de CPU.

Pode haver maneiras mais precisas ou mais portáteis, mas menos portáteis, para obter essas informações. Verifique a documentação do seu comando ps ou seu sistema de arquivos proc .

No Linux, essas informações estão em /proc/$pid/stat .

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

O tempo da CPU está em jiffies; Eu não sei de improviso como encontrar o valor do jiffy a partir do shell. O horário de início é relativo ao tempo de inicialização (encontrado em /proc/uptime ).

    
por 22.02.2011 / 22:31
16
ps -eo pid,comm,cmd,start,etime | grep -i X

X é o nome do processo

    
por 28.08.2013 / 10:11
13

ps usa a opção -o para especificar o formato de saída e uma das colunas disponíveis é etime . De acordo com a página man:

etime - elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.

Assim, você pode executar isso para obter o PID e o tempo decorrido de cada processo:

$ ps -eo pid,etime

Se você quiser o tempo decorrido de um determinado PID (por exemplo, 12345), pode fazer algo como:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( Editar : Acontece que há uma sintaxe mais curta para o comando acima; consulte resposta do mattdm )

    
por 22.02.2011 / 22:20
4

Não sei por que isso ainda não foi sugerido: no Linux você pode stat() o diretório / proc / [nnn] para o seu PID.

Este comportamento é explicitamente projetado para retornar a hora de início do processo, o que pode ser feito em alta resolução, e que o kernel pode fazer com precisão sem os hacks do jiffies, pois o kernel pode (obviamente) simplesmente verificar as informações relevantes. Os campos de acesso, modificação de dados e mudança de status retornam a hora de início do processo.

Melhor de tudo, você pode usar stat(1) no shell, ou a ligação apropriada para stat(2) de $ favorite_programming_language, então você pode nem precisar iniciar um processo externo.

OBSERVE que isso não funciona com /usr/compat/linux/proc no FreeBSD; os tempos de acesso / modificação / mudança de status retornados são a hora atual e a hora de nascimento é a época do UNIX. Muito estúpido o suporte não está lá se você me perguntar.

    
por 08.01.2017 / 00:57
2

Se você puder executar o tempo e executar um comando, obterá exatamente o que está procurando. Você não pode fazer isso contra um comando já em execução.

[0]% tempo de sono 20

sleep 20 0.00s usuário 0.00s system 0% cpu 20.014 total

    
por 25.02.2011 / 18:56
0

você pode obter a hora de início do processo observando o stat do arquivo de estatísticas produzido por proc , formatando-o usando date e subtrai-o da hora atual:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

onde 13494 é o seu processo 'pid

    
por 10.08.2018 / 12:12
0

$ ps -eo lstart começa a hora de início

$ ps -eo etime obter duração / tempo decorrido

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 é o ID do processo.

    
por 17.09.2018 / 06:57

Tags