Como encontrar o tempo de atividade de um processo Linux

Como encontrar o tempo de atividade de um processo Linux

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

ps aux | grep gedit | grep -v grep

me dá muitas informações que incluem 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

Responder1

Como “uptime” tem vários significados, aqui está um comando útil.

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

Este comando lista todos os processos com diversas colunas diferentes 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 que o processo foi iniciado (hora do relógio de parede), formato [[dd-]hh:]mm:ss TIME= tempo cumulativo de CPU, "[dd-]hh:mm:ss" formato
segundo COMMAND= novamente o comando, desta vez com todas as opções e argumentos fornecidos

Responder2

Se você tiver uma versão limitada, pscomo a encontrada em busybox, poderá obter o horário de início do processo observando o carimbo de data / hora do /proc/<PID>. Por exemplo, se o pid que você deseja ver for 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

Responder3

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

Responder4

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

Eu não acho que você possa obter milissegundos com precisão. por exemplo. se você observar man procfsqual /proc/$$/stattem o campo 22 como horário de início, que está em "clock ticks", você teria algo mais preciso, mas os ticks do relógio não estão indo a uma taxa perfeitamente constante (em relação ao 'tempo do relógio de parede') e irão estar desligado... dormindo e certas coisas (ntpd, eu acho) compensam isso. Por exemplo em uma máquina rodando ntpd, com 8 dias de uptime e nunca dormiu, dmesg -Ttem o mesmo problema (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

Aqui estão 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"

informação relacionada