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.