Gostaria de evitar fazer isso iniciando o processo a partir de um aplicativo de monitoramento.
No Linux com o ps
from procps(-ng)
(e na maioria dos outros sistemas, pois isso é especificado pelo POSIX):
ps -o etime= -p "$$"
Onde $$
está o PID do processo que você deseja verificar. Isso retornará o tempo decorrido no formato [[dd-]hh:]mm:ss
.
O uso -o etime
informa ps
que você deseja apenas o campo de tempo decorrido, e o =
final do mesmo suprime o cabeçalho (sem, você obtém uma linha que diz ELAPSED
e depois o tempo na próxima linha; com, você obtém 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 outros), use:
ps -o etimes= -p "$$"
(com um acréscimo s
) para obter o tempo formatado em segundos, o que é mais útil em scripts.
No Linux, o ps
programa obtém isso de /proc/$$/stat
onde um dos campos (consulte man proc
) é a hora de início do processo. Infelizmente, este é o tempo especificado em jiffies (um contador de tempo arbitrário usado no kernel do Linux) desde a inicialização do sistema. Portanto, você deve determinar o tempo em que o sistema inicializou (a partir de /proc/stat
), o número de instantes por segundo nesse sistema e, em seguida, fazer as contas para obter o tempo decorrido em um formato útil.
É ridiculamente complicado encontrar o valor de HZ (ou seja, instantes por segundo). Dos comentários no sysinfo.c
pacote procps, pode-se A) incluir o arquivo de cabeçalho do kernel e recompilar se um kernel diferente for usado, B) usar a sysconf()
função posix , que, infelizmente, usa um valor codificado embutido na biblioteca C, ou C) pergunte ao kernel, mas não há interface oficial para fazer isso. Portanto, o ps
código inclui uma série de cláusulas pelas quais determina o valor correto. Uau.
Portanto, é conveniente ps
fazer tudo isso para você. :)
Como observa o usuário @ 336_, no Linux (isso não é portátil), você pode usar o stat
comando para examinar as datas de acesso, modificação ou alteração de status do diretório /proc/$$
(onde novamente $$
é o processo de interesse). Todos os três números devem ser iguais, então
stat -c%X /proc/$$
fornecerá o tempo em que o processo $$
começou, em segundos desde a época. Isso ainda não é exatamente o que você deseja, 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 de formato longo como em -c%x
vez de -c%X
, obterá uma resolução maior que o número inteiro segundos. Mas, se você precisar, provavelmente deve usar a abordagem de auditoria de processos, porque o tempo de execução do comando stat interferirá na precisão.
etime=
um erro de digitação? Só consigo encontraretime
nas páginas do manual.=
suprime o cabeçalho. Experimentá-lo sem, ou tentarps -p $$ -o etime="Silly Header Here"
etimes
me como então é de leitura ópticasysconf()
e, portanto, fornece o valor codificado da biblioteca C, conforme observado, não é?Portátil:
isto é, o shell foi iniciado em 30 de janeiro e totalizou cerca de 6 segundos de tempo de CPU.
Pode haver maneiras mais precisas ou mais analisáveis, mas menos portáteis, de obter essas informações. Verifique a documentação do seu
ps
comando ou do seuproc
sistema de arquivos.No Linux, essas informações estão presentes
/proc/$pid/stat
.O tempo da CPU está em instantes; Não sei de imediato como encontrar o valor instável do shell. O horário de início é relativo ao horário de inicialização (encontrado em
/proc/uptime
).fonte
sysinfo.c
pacote procps, pode-se: a) 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 no a biblioteca c, ou c) pergunte ao kernel, e não há interface oficial para fazer isso. Portanto, o código inclui uma série de cláusulas pelas quais determina o valor correto. Uau.ps
manual afirma quetime
é "tempo acumulado da CPU". Eu acho que o que o OP estava procurandoetime
, ou "o tempo decorrido desde que o processo foi iniciado". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.htmletime
.X é o nome do processo
fonte
ps -o pid,comm,cmd,start,etime -p X
para olhar o PID X.ps
toma uma-o
opção para especificar o formato de saída e uma das colunas disponíveis éetime
. De acordo com a página do manual:Assim, você pode executar isso para obter o PID e o tempo decorrido de cada processo:
Se você deseja o tempo decorrido de um PID específico (por exemplo, 12345), pode fazer algo como:
( Edit : Acontece que há uma sintaxe mais curta para o comando acima; veja a resposta de mattdm )
fonte
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.Esse comportamento foi projetado explicitamente para retornar o horário de início do processo, o que pode ser feito em alta resolução e o que o kernel pode executar com precisão sem os hacks do jiffies, já que o kernel pode (obviamente) simplesmente verificar as informações relevantes. Os campos de acesso, modificação de dados e alteração de status retornam o horário de início do processo.
O melhor de tudo é que você pode usá-lo
stat(1)
no shell ou na ligação apropriadastat(2)
de $ favorite_programming_language, para que você nem precise iniciar um processo externo.Observe que isso não funciona
/usr/compat/linux/proc
no FreeBSD; os horários de acesso / modificação / alteração de status retornados são a hora atual e a hora do nascimento é a época do UNIX. Muito estúpido, o apoio não existe se você me perguntar.fonte
stat /proc/4480
Isso fornecerá as datas de nascimento, alteração, modificação e acesso do processo. Se você precisar da identificação do processo, basta usar "top"Se você pode executar o tempo e executar um comando, obterá exatamente o que está procurando. Você não pode fazer isso com um comando já em execução.
[0]% de tempo de sono 20
sono 20 0.00s usuário 0.00s sistema 0% cpu 20.014 total
fonte
você pode obter a hora de início do processo, observando o
stat
arquivo stat produzido porproc
, formatá-lo usandodate
e subtraí-lo do horário atual:echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
Onde
13494
está o seu processo?fonte
$ ps -eo lstart
obter hora de início$ ps -eo etime
obter duração / tempo decorrido61819 é o ID do processo.
fonte
Tempo decorrido em segundos:
expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
fonte
date +%s --date="now - $( stat -c%X /proc/$$