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

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

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

ps -p $PROCID -o cputime,etimes 

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

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

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

 2-03:01:33 2653793 

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

3 Solutions collect form web for “Отформатируйте вывод cputime для ps”

Это преобразует первый раз в секунды:

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

Если вы не хотите вводить 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 

Вы не указываете, для какой операционной системы это необходимо; если это Linux, и учитывая, что вы заинтересованы в мониторинге определенного процесса, вам может показаться более полезным проанализировать /proc/$PROCID/stat – подробнее см. страницу руководства proc(5) .

  • В каком каталоге работает узел?
  • Вызовите 'ps' как обычный пользователь в Linux
  • Что может заставить ps сообщать uid вместо имени пользователя?
  • Среднее использование ЦП процесса
  • Различное представление bash в команде «ps -f»
  • Поле TIME в ps -ef
  • Могу ли я получить WCHAN от ps на Mac OS X 10.7.4?
  • Добавить поле sid в вывод ps -f
  • Просмотр предков текущего процесса и формирование результата
  • Какие флаги команды «ps» предназначены для формата флагов Unix и какие флаги для формата флагов BSD?
  • Печать как Firefox
  • Linux и Unix - лучшая ОС в мире.