Відформатуйте висновок cputime для ps


13

Я намагаюся написати сценарій, який може контролювати використання процесора процесора протягом інтервалу (щоб створити графік).

Поки це команда, яку я використовую

ps -p $PROCID -o cputime,etimes

Моє єдине занепокоєння полягає в тому, що вихід cputime здається [dd]hh:mm(або щось подібне, зараз не можу згадати)

Чи є спосіб відформатувати cputime в секундах, на зразок etime -> etimes, щоб пройти час у секундах?

Редагувати: це вихід, який я отримую в даний час

2-03:01:33 2653793

Я хотів би, щоб перший параметр був відформатований за секунди, а не дні-години: хвилини: секунди.


чи можете ви додати результат, який ви отримаєте зараз, і результат, який ви хочете отримати?
Simply_Me

@Simply_Me Я відредагував повідомлення
dreadiscool

@ John1024 Так, так, це кількість днів.
dreadiscool

Відповіді:


9

Це перетворює перший раз в секунди:

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

Наприклад, команда ps створює:

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

awkКоманда обробляє це і повертає:

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

Пояснення

  • -F'[: ]+'

    Це говорить awk, щоб розглядати як колонки, так і пробіли як роздільники поля. Таким чином, години, хвилини та секунди відображаються як окремі поля.

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

    Початковий /:/обмежує код працювати лише на лініях, що містять двокрапку. Це видаляє рядки заголовка. Кількість секунд обчислюється з годин, хвилин, секунд через t=$3+60*($2+60*$1). Потім отримане значення для tдрукується разом із минулим часом.

Поводження днів

Якщо psвиробляються дні, години, хвилини, секунди, як у:

2-03:01:33

Потім скористайтеся цим кодом:

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

Якщо дні можуть бути або не можуть бути попередженими до виводу, використовуйте цю комбінаційну команду:

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}'

Пробачте, якщо я помиляюсь, але не схоже, що ця команда враховує дні, які також можна
попередити

Це правильно: у моїй системі не було показано днів жодного процесу. Я можу здогадатися, як можуть виглядати дні, але чи можете ви надати справжній приклад?
John1024

2-03: 01: 33 - це 2 дні, 3 години, 1 хвилина та 33 секунди. Однак, не завжди дні бувають передчутними. У моїй системі це передбачається лише в тому випадку, якщо процес був активний більше 24 годин. Дякую за вашу допомогу, поки що не було, я ціную це
dreadiscool

@ user1772510 Відповідь оновлено, щоб обробляти дні.
John1024

Дякую за всю вашу допомогу, якби я міг подати заявку, я б також схвалив (недостатньо представників у цій громаді), я це глибоко вдячний!
dreadiscool

2

Якщо ви не хочете вводити awk в гру, чисте рішення bash (t_str містить форматовану рядок, t_sec розшифровується час у секундах):

# 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

Ви не вказуєте, для якої операційної системи це призначено; якщо це Linux, і з огляду на те, що ви зацікавлені в моніторингу певного процесу, вам може здатися більш доцільним проаналізувати /proc/$PROCID/stat- proc(5)детальну інформацію див . на сторінці керівництва.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.