risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come trovare uptime di un processo linux

Come trovo il tempo di attività di un determinato processo linux.

ps aux | grep gedit | grep -v grep

mi dà un sacco di informazioni che includono il momento in cui è stato avviato il processo. Sono specificamente alla ricerca di switch che restituisca il tempo di attività di un processo in millisecondi.

Grazie

66

Poiché "tempo di attività" 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
first COMMAND = solo il nome del comando senza opzioni e senza argomenti
STARTED = il tempo assoluto in cui è stato avviato il processo
ELAPSED = tempo trascorso da quando il processo è stato avviato ( tempo di parete ), formato [[dd-] hh:] mm: ss TIME = tempo CPU cumulativo, "[dd-] hh: mm : ss "format
secondo COMMAND = di nuovo il comando, questa volta con tutte le opzioni e gli argomenti forniti

110
Abdull

Se si dispone di una versione limitata di ps come si trova in busybox, è possibile ottenere l'ora di inizio del processo osservando il timestamp di /proc/<PID>. Ad esempio, se il pid che vuoi guardare è 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
9
goertzenator

Penso che tu possa solo correre:

$ stat /proc/1234

1234 è l'id del processo.

esempio con due processi avviati alla stessa ora minuti 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
6
yohann.martineau

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

Non penso che tu possa ottenere esattamente millisecondi. per esempio. se vedi man procfs e vedi /proc/$$/stat che ha il campo 22 come startime, che è in "clock ticks", avresti qualcosa di più preciso, ma i tick di clock non stanno andando a un ritmo perfettamente costante (rispetto a "wall clock time") e andrà via ... dormendo e certe cose (ntpd immagino) lo compenseranno. Ad esempio su una macchina che esegue ntpd, con 8 giorni di operatività e non ha mai dormito, dmesg -T ha lo stesso problema (credo ...), 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"
4
Peter

sì, troppo vecchio e roba troppo dura. Ho provato con il metodo "stat" sopra proposto, ma cosa succede se ho "toccato" ieri il proc proc PID? Ciò significa che il mio processo di un anno è mostrato con il timestamp di ieri. Nah, non quello di cui ho bisogno :(

Nei nuovi, è semplice:

ps -o etimes -p <PID>
ELAPSED
339521

così semplice. Il tempo è presente in secondi. Fai tutto il necessario per. Con alcune scatole più vecchie, la situazione è più difficile, poiché non ci sono etimi. Si potrebbe fare affidamento su:

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

che sembrano un po 'strani visto che è in formato dd-hh: mm: ss. Non adatto per ulteriori calcoli. L'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
3
George Ivanov