Отформатируйте вывод cputime для ps

13

Я пытаюсь написать сценарий, который может контролировать загрузку процессора процесса в течение определенного промежутка времени (для создания графика).

Пока что это команда, которую я использую

ps -p $PROCID -o cputime,etimes

Единственное, что меня беспокоит, так это то, что cputime выводится [dd]hh:mm(или что-то подобное, не могу вспомнить сейчас)

Есть ли способ отформатировать cputime в секундах, например, etime -> etimes, чтобы получить истекшее время в секундах?

Изменить: это вывод, который я в настоящее время получаю

2-03:01:33 2653793

Я бы хотел, чтобы первый параметр форматировался в секундах, а не в днях, часах, минутах и ​​секундах.

dreadiscool
источник
Можете ли вы добавить результат, который вы получаете сейчас, и результат, который вы хотите получить?
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
источник
Простите, если я ошибаюсь, но не похоже, чтобы эта команда учитывала дни, которые также могут быть добавлены
dreadiscool
Это правильно: моя система не показала дни для какого-либо процесса. Я могу догадаться, как могут выглядеть дни, но не могли бы вы привести реальный пример?
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)странице руководства.

Тоби Спейт
источник