Respostas:
No Linux com o psfrom 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 etimeinforma psque 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 ELAPSEDe 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 psprograma obtém isso de /proc/$$/statonde 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.cpacote 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 pscódigo inclui uma série de cláusulas pelas quais determina o valor correto. Uau.
Portanto, é conveniente psfazer tudo isso para você. :)
Como observa o usuário @ 336_, no Linux (isso não é portátil), você pode usar o statcomando 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%xvez 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.
=suprime o cabeçalho. Experimentá-lo sem, ou tentarps -p $$ -o etime="Silly Header Here"
etimesme como então é de leitura óptica
sysconf()e, portanto, fornece o valor codificado da biblioteca C, conforme observado, não é?
Portátil:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
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 pscomando ou do seu procsistema de arquivos.
No Linux, essas informações estão presentes /proc/$pid/stat.
awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/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).
sysinfo.cpacote 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.
psmanual afirma que timeé "tempo acumulado da CPU". Eu acho que o que o OP estava procurando etime, ou "o tempo decorrido desde que o processo foi iniciado". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime.
ps -eo pid,comm,cmd,start,etime | grep -i X
X é o nome do processo
ps -o pid,comm,cmd,start,etime -p Xpara olhar o PID X.
pstoma uma -oopção para especificar o formato de saída e uma das colunas disponíveis é etime. De acordo com a página do manual:
etime - tempo decorrido desde o início do processo, no formato [[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ê deseja o tempo decorrido de um PID específico (por exemplo, 12345), pode fazer algo como:
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
( Edit : Acontece que há uma sintaxe mais curta para o comando acima; veja a resposta de mattdm )
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 apropriada stat(2)de $ favorite_programming_language, para que você nem precise iniciar um processo externo.
Observe que isso não funciona /usr/compat/linux/procno 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.
stat /proc/4480Isso 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
$ ps -eo lstart obter 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.
Tempo decorrido em segundos: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=um erro de digitação? Só consigo encontraretimenas páginas do manual.