Chciałbym tego uniknąć, uruchamiając proces z aplikacji do monitorowania.
W systemie Linux z ps
od procps(-ng)
(i większości innych systemów, ponieważ ten jest określony przez POSIX):
ps -o etime= -p "$$"
Gdzie $$
jest PID procesu, który chcesz sprawdzić. Zwróci czas, który upłynął w formacie [[dd-]hh:]mm:ss
.
Używanie -o etime
mówi, ps
że chcesz tylko pola czasu, które upłynęły, a =
na końcu tego pomija nagłówek (bez, dostajesz linię, która mówi, ELAPSED
a następnie czas w następnej linii; z, otrzymujesz tylko jedną linię z czasem) .
Lub, w nowszych wersjach pakietu narzędzi procps-ng (3.3.0 lub nowszy) w systemie Linux lub FreeBSD 9.0 lub nowszym (i ewentualnie w innych), użyj:
ps -o etimes= -p "$$"
(z dodanym s
), aby sformatować czas w sekundach, co jest bardziej przydatne w skryptach.
W systemie Linux ps
program pobiera to /proc/$$/stat
, skąd jednym z pól (patrz man proc
) jest czas rozpoczęcia procesu. Niestety jest to określony czas w jiffies (dowolny licznik czasu używany w jądrze Linuksa) od momentu uruchomienia systemu. Musisz więc określić czas, w którym system został uruchomiony (z /proc/stat
), liczbę jiffies na sekundę w tym systemie, a następnie wykonać obliczenia matematyczne, aby uzyskać upływający czas w przydatnym formacie.
Okazuje się, że znalezienie HZ (absurdów na sekundę) jest absurdalnie skomplikowane. Na podstawie komentarzy w sysinfo.c
pakiecie procps można A) dołączyć plik nagłówka jądra i dokonać ponownej kompilacji, jeśli używane jest inne jądro, B) użyć sysconf()
funkcji posix , która niestety używa zakodowanej wartości wkompilowanej w bibliotekę C lub C) zapytaj jądro, ale nie ma do tego oficjalnego interfejsu. Tak więc ps
kod zawiera serię kludges, dzięki którym określa poprawną wartość. Łał.
To wygodne, że ps
to wszystko dla Ciebie. :)
Jak zauważa użytkownik @ 336_, w systemie Linux (nie jest to przenośny) można użyć stat
polecenia, aby sprawdzić daty dostępu, modyfikacji lub zmiany statusu dla katalogu /proc/$$
(gdzie znowu $$
jest procesem zainteresowania). Wszystkie trzy liczby powinny być takie same, więc
stat -c%X /proc/$$
da ci czas, w którym proces się $$
rozpoczął, w sekundach od epoki. To wciąż nie jest dokładnie to, czego chcesz, ponieważ nadal musisz wykonać matematykę, aby odjąć to od bieżącego czasu, aby upłynąć czas - Myślę, że coś takiego date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"
działałoby, ale jest to trochę niezręczne. Jedną możliwą zaletą jest to, że jeśli użyjesz danych wyjściowych o długim formacie, takich jak -c%x
zamiast -c%X
, otrzymasz wyższą rozdzielczość niż liczba całkowita w sekundach. Ale jeśli jest to potrzebne, prawdopodobnie powinieneś zastosować metodę kontroli procesu, ponieważ czas uruchomienia polecenia stat będzie zakłócał dokładność.
etime=
literówka? Mogę znaleźć tylkoetime
na stronach podręcznika.=
pomija nagłówek. Wypróbuj bez lub spróbujps -p $$ -o etime="Silly Header Here"
etimes
siebie, ponieważ jest to do odczytu maszynowegosysconf()
a zatem daje ci zakodowaną wartość z biblioteki C, jak wspomniano, prawda?Przenośny:
tzn. powłoka została uruchomiona 30 stycznia i trwała około 6 sekund czasu procesora.
Mogą istnieć bardziej precyzyjne lub dokładniejsze, ale mniej przenośne sposoby uzyskania tych informacji. Sprawdź dokumentację swojego
ps
polecenia lubproc
systemu plików.Pod Linuksem ta informacja żyje
/proc/$pid/stat
.Czas procesora jest w jiffies; Nie wiem od razu, jak znaleźć wartość jiffy z powłoki. Czas rozpoczęcia zależy od czasu rozruchu (można znaleźć w
/proc/uptime
).źródło
sysinfo.c
pakiecie procps można: a) dołączyć plik nagłówka jądra (i dokonać ponownej kompilacji, jeśli używane jest inne jądro, b) użyć funkcji posix sysconf (), która niestety używa zakodowanej na stałe wartości wkompilowanej w biblioteka c lub c) zapytaj jądro i nie ma oficjalnego interfejsu do robienia tego. Tak więc kod zawiera serię kludges, dzięki którym określa poprawną wartość. Łał.ps
man stwierdza, żetime
jest to „skumulowany czas pracy procesora”. Myślę, że to, czego szukał PO, toetime
„czas, jaki upłynął od rozpoczęcia procesu”. pubs.opengroup.org/onlinepubs/000095399/utilities/ps.htmletime
Jednak przynajmniej obsługuje .X to nazwa procesu
źródło
ps -o pid,comm,cmd,start,etime -p X
spojrzeć na PID X.ps
przyjmuje-o
opcję określenia formatu wyjściowego, a jedną z dostępnych kolumn jestetime
. Według strony podręcznika:W ten sposób możesz uruchomić to, aby uzyskać PID i upływ czasu każdego procesu:
Jeśli chcesz, aby upłynął czas określonego PID (np. 12345), możesz zrobić coś takiego:
( Edycja : okazuje się, że dla powyższego polecenia istnieje krótsza składnia; zobacz odpowiedź mattdm )
źródło
Nie wiem, dlaczego nie zostało to jeszcze zasugerowane: w systemie Linux możesz mieć
stat()
katalog / proc / [nnn] dla swojego PID.To zachowanie zostało wyraźnie zaprojektowane, aby zwrócić czas rozpoczęcia procesu, co może zrobić w wysokiej rozdzielczości, i które jądro może zrobić dokładnie bez hakowania jiffies, ponieważ jądro może (oczywiście) po prostu sprawdzić odpowiednie informacje. Pola dostępu, modyfikacji danych i zmiany statusu zwracają czas rozpoczęcia procesu.
Najlepsze jest to, że możesz użyć
stat(1)
w powłoce lub odpowiednim powiązaniustat(2)
z $ favour_programming_language, więc może nie być konieczne uruchomienie zewnętrznego procesu.UWAGA , że ma nie pracować
/usr/compat/linux/proc
na FreeBSD; zwrócone czasy dostępu / modyfikacji / zmiany statusu są bieżącym czasem, a czas narodzin to epoka UNIX. Całkiem głupie wsparcie nie istnieje, jeśli mnie o to poprosisz.źródło
stat /proc/4480
datę urodzenia, zmiany, modyfikacji i dostępu do procesu. Jeśli potrzebujesz identyfikatora procesu, po prostu użyj „góry”Jeśli możesz uruchomić czas, a następnie wykonać polecenie, otrzymasz dokładnie to, czego szukasz. Nie możesz tego zrobić w stosunku do już uruchomionego polecenia.
[0]% czasu snu 20
spać 20 0,00s użytkownik 0,00s system 0% cpu 20,014 ogółem
źródło
możesz uzyskać czas rozpoczęcia procesu, patrząc na
stat
plik statystyk utworzony przezproc
, sformatuj go za pomocądate
i odejmij od bieżącego czasu:echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
gdzie
13494
jest twój pid procesźródło
$ ps -eo lstart
uzyskać czas rozpoczęcia$ ps -eo etime
uzyskać czas trwania / upływający czas61819 jest identyfikatorem procesu.
źródło
Czas, który upłynął w sekundach:
expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
źródło
date +%s --date="now - $( stat -c%X /proc/$$