Come trovare i tempi di attività di un processo Linux


69

Come posso trovare il tempo di attività di un determinato processo di Linux.

ps aux | grep gedit | grep -v grep

mi dà un sacco di informazioni che includono l'ora in cui è stato avviato il processo. Sto specificatamente cercando switch che restituisca il tempo di attività di un processo in millisecondi.

Grazie

Risposte:


113

Poiché "uptime" ha diversi significati, ecco un comando utile.

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

Questo comando elenca tutti i processi con diverse colonne correlate al tempo. Ha le seguenti colonne:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= ID processo
prima COMMAND= solo il nome del comando senza opzioni e senza argomenti
STARTED= il tempo assoluto in cui il processo è stato avviato
ELAPSED= tempo trascorso dall'avvio del processo ( tempo di clock ), formato [[dd-] hh:] mm: ss TIME= cumulativo CPU time, "[dd-] hh: mm: ss"
secondo formato COMMAND= di nuovo il comando, questa volta con tutte le opzioni e gli argomenti forniti


1
Bello. Preferisco etimesme stesso - tempo trascorso in secondi - quindi è leggibile automaticamente
Asfand Qazi

1
la domanda riguardava il tempo stat in millisecondi
yohann.martineau,

sfortunatamente, busybox 1.29.3 ha interrotto la formattazione per etime, quindi non fare affidamento su di essa per l'analisi.
Danny Dulai,

10

Se si dispone di una versione limitata di psquella presente in busybox, è possibile ottenere l'ora di inizio del processo osservando il timestamp di /proc/<PID>. Ad esempio, se il pid che vuoi vedere è 55 ...

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

... e poi confrontalo con la data corrente ...

# date
Thu May 22 03:00:47 EDT 2014

1
Questo sembra non funzionare più sui kernel attuali.
goertzenator,

7

Penso che puoi semplicemente eseguire:

$ stat /proc/1234

1234 è l'ID del processo.

esempio con due processi avviati alla stessa ora minuto secondi ma non gli stessi millisecondi:

$ 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

4

Una cosa così semplice non riceve una risposta adeguata dopo 5 anni?

Non penso che tu possa ottenere con precisione millisecondi. per esempio. se vedi man procfse vedi /proc/$$/statquale ha il campo 22 come startime, che è in "tick di clock", avresti qualcosa di più preciso, ma i tick di clock non stanno andando a un ritmo perfettamente costante (rispetto al "tempo di clock") e essere spento ... dormire e certe cose (ntpd immagino) compensarlo. Ad esempio su una macchina che esegue ntpd, con 8 giorni di disponibilità e non ha mai dormito, dmesg -Tha lo stesso problema (penso ...), e puoi vederlo qui:

# 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

Ecco i secondi:

# 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"

3

sì, roba troppo vecchia ma troppo dura. Ho provato con il metodo "stat" sopra proposto, ma se avessi "toccato" il comando PID ieri? Ciò significa che il mio processo di un anno viene mostrato con il timestamp di ieri. No, non quello di cui ho bisogno :(

In quelli più recenti, è semplice:

ps -o etimes -p <PID>
ELAPSED
339521

così semplice. Il tempo è presente in secondi. Fai quello che ti serve. Con alcune scatole più vecchie, la situazione è più difficile, dal momento che non c'è etimes. Si potrebbe fare affidamento su:

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

che sembrano un po '"strani" dal momento che è nel formato dd-hh: mm: ss. Non adatto per ulteriori calcoli. Lo avrei preferito in pochi secondi, quindi ho usato questo:

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

Questo è davvero un bel modo di farlo sui sistemi più vecchi, grazie :)
RobotJohnny

non analizzare l'output di etime perché busybox 1.29.3 ha cambiato il formato. usa invece il metodo stat + / proc
Danny Dulai,

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => ID processo per il processo Java

etimes= => tempo in secondi e '=' è per rimuovere l'intestazione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.