Você pode usar a contabilidade de processo do BSD. lastcomm
não reporta o tempo decorrido, mas pelo menos no Linux, ele é armazenado no banco de dados de contabilidade e pode ser consultado com o comando dump-acct
.
$ sudo accton on # activate process accounting
$ sleep 5.23
$ sudo dump-acct /var/log/account/pacct | grep '^sleep'
sleep |v3| 0.00| 0.00| 523.00| 10031| 10031| 14632.00| 0.00| 15261 416|Mon Jun 2 17:09:37 2014
O tempo decorrido é o 5º campo (acima de 523 centi-segundos).
Os campos 3 e 4 são o tempo do usuário e a hora do sistema, ou seja, o tempo que a CPU (qualquer CPU) gasta executando esse processo (qualquer thread desse processo).
Note que (pelo menos no Linux), o processo é contabilizado quando ele (qualquer thread de seu) morre e como o nome do processo que ele tinha quando morreu. Isso significa que, por exemplo, em:
sh -c 'sleep 4; exec sleep 5'
Um processo executa sh
e, em seguida, bifurca outro processo para executar sleep 4
e, em seguida, o primeiro processo executa sleep 5
(alterando o nome). No banco de dados de contabilidade, obtemos:
sleep |v3| 0.00| 0.00| 400.00| 1000| 1000| 10320.00| 0.00| 28867 28866|Tue Jun 3 07:45:52 2014
sleep |v3| 0.00| 0.00| 900.00| 1000| 1000| 10320.00| 0.00| 28866 28801|Tue Jun 3 07:45:52 2014
Esse é o processo que executa sh
e, em seguida, sleep 5
é contabilizado como sleep
por 900 segundos, e não há menção a sh
.
Para firefox
(um aplicativo altamente multiencadeado) infelizmente, no meu caso, vejo tempos muito curtos, porque o processo é contabilizado quando um segmento de vida curta morre.