
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, ps
como 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 procfs
qual /proc/$$/stat
tem 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 -T
tem 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"