Jak uzyskać czas rozpoczęcia długotrwałego procesu Linux? [Zamknięte]

250

Czy można uzyskać czas rozpoczęcia starego uruchomionego procesu? Wygląda na to, że pszgłosi datę (nie godzinę), jeśli nie została uruchomiona dzisiaj, i tylko rok, jeśli nie została uruchomiona w tym roku. Czy precyzja utracona na zawsze dla starych procesów?

ajwood
źródło
16
Czy jest coś złego w korzystaniu ps -p <pid> -o lstart? Wydaje się, że to działa, ale nie jestem pewien, dlaczego nie jest to bezpośrednia oczywista odpowiedź na wiele razy, kiedy to pytanie wydaje się pojawiać.
ajwood 20.04.11
7
@ajwood Lepiej byłoby użyć, ps -p <pid> -o lstart=aby uniknąć drukowania dodatkowej linii (nagłówka).
Vladimir Protasov
2
Czy jest coś złego w korzystaniu ps -p <pid> -o lstart? Może fakt, że nie ma lstartani w edycji 2004, ani w wersji 2013 POSIX 1003.1?
Piotr Dobrogost
5
@PiotrDobrogost, byłby to problem, gdyby pytanie dotyczyło POSIX, ale dotyczy Linuxa.
womble
4
Mody - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - dlaczego nie przestawisz go na bardziej odpowiednią stronę, taką jak StackExchange lub Superuser, zamiast zamykać pytanie? To dobre i przydatne pytanie
Hanxue,

Odpowiedzi:

392

Możesz określić formatyzator i użyć go lstart, na przykład polecenia:

ps -eo pid,lstart,cmd

Powyższe polecenie wyświetli wszystkie procesy wraz z formaterami do pobrania PID, uruchomienia polecenia i uruchomienia daty i godziny.

Przykład (z wiersza poleceń Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Możesz przeczytać stronę pspodręcznika lub sprawdzić stronę Opengroup pod kątem innych formatów.

wkl
źródło
3
@ bobbyrne01: zmień kolejność, np. pid, etime, cmd działa dla mnie na Debian Wheezy.
exic
1
@Gobliins - etimeczas, który upłynął od rozpoczęcia procesu.
wkl,
4
dla kompletności, dla osób przyzwyczajonych do składni BSD: ps axo pid,cmd,lstartdziała również
Graeme Moss,
2
@ bobbyme01: użyj opcji -ww
Ed Randall
1
Należy pamiętać, że lstartczas może się zmienić, gdy statmetody poniżej są bezpieczniejsze - unix.stackexchange.com/questions/274610/... .
slm
43

Polecenie ps (przynajmniej wersja procps używana przez wiele dystrybucji Linuksa) ma wiele pól formatu, które odnoszą się do czasu rozpoczęcia procesu, w tym lstartzawsze podaje pełną datę i godzinę rozpoczęcia procesu:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Omówienie sposobu publikowania informacji w systemie plików / proc znajduje się na stronie /unix/7870/how-to-check-how-long-a-process-has-been-running

(Z mojego doświadczenia w Linuksie znacznik czasu w katalogach / proc / wydaje się być związany z momentem, kiedy ostatnio uzyskano dostęp do katalogu wirtualnego, a nie z czasem rozpoczęcia procesów:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Zauważ, że w tym przypadku uruchomiłem polecenie „ps -p 1” około 16:50, a następnie odrodziłem nową powłokę bash, a następnie krótko potem uruchomiłem polecenie „ps -p 1 -p $$” w tej powłoce ... .)

Nathan
źródło
Aby zobaczyć każdy proces (nie tylko własny) dodaj argument e( psskładnia standardowa ) lub ax(składnia BSD) do polecenia ps: tj. ps -ewo pid,lstart,cmdLubps -axwo pid,lstart,cmd
Ryan Griffith
15

W nawiązaniu do odpowiedzi Adam Matan za tego, /proc/<pid>czas znaczek katalogu jako takie nie zawsze jest bezpośrednio przydatna, ale można użyć

awk -v RS=')' 'END{print $20}' /proc/12345/stat

aby uzyskać czas rozpoczęcia w zegarze tyka od uruchomienia systemu. 1

Jest to nieco trudna jednostka do użycia; zobacz także konwertuj jiffies na sekundy, aby poznać szczegóły.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

To powinno dać ci sekundy, które możesz przekazać, strftime()aby uzyskać znacznik czasu (czytelny dla człowieka lub inny).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Zaktualizowano w niektórych poprawkach Stephane Chazelas w komentarzach; dzięki jak zawsze!

Jeśli masz tylko Mawk, może spróbuj

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 człowiek proc ; wyszukaj czas rozpoczęcia .

potrójny
źródło
Lekko przebudowany
tripleee
1
Pamiętaj, że strftime()i systime()nie są obecne mawk, co jest domyślne awkw moich obrazach VPS Debiana 8, więc mogę tylko założyć, że są one specyficzne dla gawkdialektu.
ssokolow
13
ls -ltrh /proc | grep YOUR-PID-HERE

Na przykład PID mojej przeglądarki Google Chrome to 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583
Adam Matan
źródło
6
To nie działa dla mnie - drukuje czas modyfikacji (często się zmienia) Może z tego powodu: unix.stackexchange.com/questions/20460/…
user920391
Sygnatura czasowa / proc / <pid> nie jest wiarygodna.
Henning
1
Zwróciło to czas 9 minut później niż kiedy proces, o którym mam informacje, faktycznie się rozpoczął.
Dan Dascalescu,
1
To wydaje się być moją jedyną opcją, która działa, choć może nie jest niezawodna. Jestem na systemie wbudowanym, który ma tylko busybox, psktóry mówi invalid optiono wszystkich opcjach wymienionych w innych odpowiedziach.
Qi Fan
7
Dlaczego grep? Dlaczego nie ls -ldh /proc/$pid? A może nawet lepiej date -r /proc/$pid?
Cezar
6
 ps -eo pid,etime,cmd|sort -n -k2
bash-o-logist
źródło
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Przepełnienie stosu
źródło
1
Będzie to obejmować również własny proces
Paul Verschoor