Como encontrar o tempo de atividade de um processo Linux

69

Como encontro o tempo de atividade de um determinado processo Linux.

ps aux | grep gedit | grep -v grep

fornece muitas informações, incluindo a hora em que o processo foi iniciado. Estou procurando especificamente um switch que retorne o tempo de atividade de um processo em milissegundos.

obrigado

Mahadevan Sreenivasan
fonte

Respostas:

113

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

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

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

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

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

Abdull
fonte
11
Agradável. Eu prefiro etimesme - tempo decorrido em segundos - por isso é de leitura óptica
Asfand Qazi
11
a pergunta era sobre o tempo de estatísticas em milissegundos
yohann.martineau
infelizmente, o busybox 1.29.3 quebrou a formatação do etime, portanto, não confie nele para analisar.
Danny Dulai
10

Se você tiver uma versão limitada da psencontrada 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 ver é 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
goertzenator
fonte
11
Isso parece não funcionar mais nos kernels atuais.
goertzenator
7

Eu acho que você pode simplesmente executar:

$ stat /proc/1234

1234 sendo o ID do processo.

exemplo, com dois processos iniciados na mesma hora, minuto 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
yohann.martineau
fonte
4

Uma coisa tão simples não é respondida corretamente após 5 anos?

Eu não acho que você pode obter com precisão milissegundos. por exemplo. se você vir man procfse ver /proc/$$/statqual campo 22 é o horário de início, que está em "tiques do relógio", você teria algo mais preciso, mas os tiques do relógio não estão indo a uma taxa perfeitamente constante (em relação ao 'relógio de parede') e estar fora ... dormindo e certas coisas (ntpd eu acho) compensar isso. Por exemplo, em uma máquina executando o ntpd, com 8 dias de atividade e nunca dormiu, dmesg -Ttem o mesmo problema (eu acho ...), e você pode vê-lo 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

Aqui estão alguns 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"
Peter
fonte
3

sim, coisas muito velhas e ainda muito difíceis. Eu tentei com o método "stat" proposto acima, mas e se eu tivesse "tocado" - no dir dir de PID ontem? Isso significa que meu processo de um ano é mostrado com o carimbo de hora de ontem. Nah, não é o que eu preciso :(

Nos mais novos, é simples:

ps -o etimes -p <PID>
ELAPSED
339521

tão simples como isso. O tempo está presente em segundos. Faça o que for necessário. Com algumas caixas mais antigas, a situação é mais difícil, já que não há épocas. Pode-se confiar em:

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

que parece um pouco "estranho", pois está no formato dd-hh: mm: ss. Não é adequado para cálculos adicionais. Eu teria preferido em segundos, portanto, 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
George Ivanov
fonte
Esta é uma forma muito agradável de fazê-lo sobre os sistemas mais antigos, graças :)
RobotJohnny
não analise a saída do etime porque o busybox 1.29.3 alterou o formato. usar o método de estatísticas + / proc vez
Danny Dulai
-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => identificação do processo para o processo java

etimes= => tempo em segundos e '=' é remover o cabeçalho

Rohit
fonte