Sformatuj wyjście cputime dla ps


13

Próbuję napisać skrypt, który może monitorować użycie procesora przez proces (w celu utworzenia wykresu).

Jak dotąd jest to polecenie, którego używam

ps -p $PROCID -o cputime,etimes

Moją jedyną obawą jest to, że wydajność cputime wydaje się być [dd]hh:mm(lub coś podobnego, nie mogę teraz zapamiętać z góry głowy)

Czy istnieje sposób sformatowania cputime w sekundach, coś w rodzaju etime -> etimes, aby uzyskać upływ czasu w sekundach?

Edycja: To jest wynik, który obecnie otrzymuję

2-03:01:33 2653793

Chciałbym, aby pierwszy parametr został sformatowany w sekundach, a nie dniach-godzinach: minutach: sekundach.


czy możesz dodać wynik otrzymany teraz i wynik, który chcesz otrzymać?
Simply_Me

@Simply_Me Zredagowałem post
dreadiscool

@ John1024 Tak, to tyle dni.
dreadiscool,

Odpowiedzi:


9

Konwertuje to po raz pierwszy na sekundy:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

Na przykład polecenie ps powoduje:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

awkPolecenie przetwarza że i powroty:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

Wyjaśnienie

  • -F'[: ]+'

    To mówi awk, aby traktował zarówno dwukropki, jak i spacje jako separatory pól. W ten sposób godziny, minuty i sekundy pojawiają się jako osobne pola.

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    Inicjał /:/ogranicza kod do działania tylko w wierszach zawierających dwukropek. To usuwa linie nagłówka. Liczba sekund jest obliczana na podstawie godzin, minut i sekund przez t=$3+60*($2+60*$1). Wynikowa wartość dla tjest następnie drukowana wraz z upływem czasu.

Obsługa dni

Jeśli psprodukuje dni, godziny, minuty, sekundy, jak w:

2-03:01:33

Następnie użyj tego kodu zamiast:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

Jeśli dni mogą, ale nie muszą być poprzedzone danymi wyjściowymi, użyj tego polecenia kombinacji:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

Wybacz mi, jeśli się mylę, ale nie wygląda na to, że to polecenie bierze pod uwagę dni, które można również
uzupełnić

To prawda: mój system nie pokazywał dni dla żadnego procesu. Zgaduję, jak mogą wyglądać dni, ale czy możesz podać prawdziwy przykład?
John1024,

2-03: 01: 33 to 2 dni, 3 godziny, 1 minuta i 33 sekundy. Dni nie zawsze są jednak zaległe. W moim systemie jest to realizowane tylko wtedy, gdy proces trwa już ponad 24 godziny. Dzięki za pomoc do tej pory, doceniam to
dreadiscool

@ user1772510 Odpowiedź zaktualizowana, aby obsługiwać dni.
John1024,

Dziękuję za całą waszą pomoc, gdybym mógł głosować, głosowałbym również (głosuję za mało w tej społeczności) Doceniam to głęboko!
dreadiscool,

2

Jeśli nie chcesz wprowadzać awk w grze, czyste rozwiązanie bash (t_str zawiera sformatowany ciąg, t_sec zdekodowany czas w sekundach):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

0

Nie określasz, dla którego systemu operacyjnego to jest; jeśli jest to Linux, a biorąc pod uwagę, że interesuje Cię monitorowanie określonego procesu, warto go przeanalizować /proc/$PROCID/stat- szczegółowe informacje można znaleźć na proc(5)stronie podręcznika.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.