Como encontrar o tempo de atividade de um processo linux

59

Como faço para encontrar o tempo de atividade de um determinado processo linux.

ps aux | grep gedit | grep -v grep

me fornece muitas informações que incluem a hora em que o processo foi iniciado. Eu estou procurando especificamente switch que retorna o tempo de atividade de um processo em milissegundos.

Obrigado

    
por Mahadevan Sreenivasan 20.01.2012 / 11:05

5 respostas

99

Como "tempo de atividade" tem vários significados, aqui está um comando útil.

ps -eo pid,comm,lstart,etime,time,args

Este comando lista todos os processos com várias colunas diferentes relacionadas ao tempo. Tem as seguintes colunas:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID = ID do processo
first COMMAND = apenas o nome do comando sem opções e sem argumentos
STARTED = o tempo absoluto que o processo foi iniciado em ELAPSED = tempo decorrido desde o início do processo ( tempo de relógio de parede ), formato [[dd-] hh:] mm: ss TIME = tempo de CPU cumulativo, formato "[dd-] hh: mm: ss"
segundo COMMAND = novamente o comando, desta vez com todas as opções e argumentos fornecidos

    
por 21.08.2012 / 16:46
7

Se você tiver uma versão limitada de ps , como encontrada em busybox , poderá obter a hora de início do processo observando o registro de data e hora de /proc/<PID> . Por exemplo, se o pid que você quer olhar é 55 ...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... e depois compare com a data atual ...

# date
Thu May 22 03:00:47 EDT 2014
    
por 14.07.2015 / 18:33
4

Acho que você pode simplesmente executar:

$ stat /proc/1234

1234 é o ID do processo.

Exemplo de

com dois processos iniciados na mesma hora, minutos e segundos, mas não nos mesmos milissegundos:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100
    
por 15.11.2017 / 14:01
3

Uma coisa tão simples não é respondida corretamente depois de 5 anos?

Eu não acho que você possa obter com precisão milissegundos. por exemplo. Se você ver man procfs e ver / proc / $$ / stat que tem o campo 22 como startime, que está em "clock ticks", você teria algo mais preciso, mas os ticks do clock não estão indo a uma taxa perfeitamente constante para 'tempo de relógio de parede') e será desligado ... dormindo e certas coisas (ntpd eu acho) compensar isso. Por exemplo, em uma máquina rodando o ntpd, com 8 dias de atividade e nunca dormiu, o dmesg -T tem o mesmo problema (eu acho ...), e você pode ver aqui:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

Eis os segundos:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"
    
por 03.03.2017 / 10:35
1

sim, coisas antigas e difíceis demais. Eu tentei com o método "stat" proposto acima, mas e se eu tivesse "toque" -ed o dir de proc PID ontem? Isso significa que meu processo de um ano é mostrado com o carimbo de hora de ontem. Não, não o que eu preciso: (

Nos mais novos, é simples:

ps -o etimes -p <PID>
ELAPSED
339521

simples assim. O tempo está presente em segundos. Faça o que você precisar. Com algumas caixas antigas, a situação é mais difícil, já que não há momentos. Pode-se confiar em:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

que parece um "um pouco" estranho, já que está no formato dd-hh: mm: ss. Não é adequado para cálculos adicionais. Eu teria preferido em segundos, por isso usei este:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544
    
por 27.08.2018 / 13:57