Время простоя процесса в Linux

Мне нужно рассчитать использование ЦП (режим пользователя, режим системы, время простоя) процесса в Linux. Я могу рассчитать использование в пользовательском и системном режиме, используя значения utime и stime из /proc/PID/stat, но я не нашел ничего, что связано со временем простоя.

Я знаю, что могу получить время простоя из /proc/stat, но это значение связано с машиной, а не с конкретным процессом.

Можно ли рассчитать время простоя процесса, зная его PID (чтение данных из каталога /proc)?


person Kornel Szymkiewicz    schedule 29.01.2012    source источник
comment
Время простоя ЦП — это время, когда он не выполнял никакого (полезного) кода. Что такое время простоя процесса?   -  person gby    schedule 29.01.2012
comment
Поправьте меня, если я ошибаюсь, но я понимаю время простоя процесса как время, когда загрузка процессора процессом (как в пользовательском, так и в системном режиме) составляет 0%.   -  person Kornel Szymkiewicz    schedule 29.01.2012
comment
Как вы считаете время, когда процесс выполняется на нескольких ядрах через несколько потоков?   -  person Basile Starynkevitch    schedule 29.01.2012


Ответы (2)


Я мало что знаю об этом, но, возможно, работает следующее:

1) Get the process start up time. Im sure thats possible
2) Generate time difference (dTime = CurrentTime - TimeProcessStarted)
3) Substract the time the process is running ( dTime - (usageSystemMode + usageUserMode))

Надеюсь это поможет! :D

person poitroae    schedule 29.01.2012
comment
Я думаю, ваше решение будет работать :) Время запуска процесса можно получить из /proc/PID/stat, используя значение времени запуска. Спасибо - person Kornel Szymkiewicz; 29.01.2012

уже слишком поздно, но я догадался, что эта команда полезна:

IFS=$'\n';for i in `ps -eo uname:20,pid,cmd | grep -v "USER\|grep\|root"`; \
do if [ $(id -g `echo $i | cut -d" " -f1`) -gt 1000 ] && \
[ $(echo $((($(date +%s) - $(date -d "$(ll -u \ 
--time-style=+"%y-%m-%d %H:%M:%S" /proc/$(echo $i | \
awk '{print $2}')/cwd | awk '{print $6" "$7}')" +%s))/3600))) >=1 ]; \
then echo $i; fi; done

использовать его в файле bash:

#!/bin/bash
IFS=$'\n'
for i in `ps -eo uname:20,pid,cmd | grep -v "USER\|grep\|root"`
do 
  Name="`echo $i | cut -d' ' -f1`"
  Id="$(id -g $Name)"
  Pid="`echo $i | awk '{print $2}'`"
  Time1=$(date +%s)
  Time2=$(date -d "$(/usr/bin/ls -lu --time-style=+"%y-%m-%d %H:%M:%S" \
 /proc/$Pid/cwd | awk '{print $6" "$7}')" +%s)/3600
  Time=$Time1-$Time2
  if [ $Id -gt 1000 ] && [ $Time >=1 ]
  then 
    echo $i
  fi

done

вы можете изменить grep -v "grep\|root" по своему усмотрению. эта однострочная команда перечисляет все процессы, которые не являются владельцем root или пользователями системы.

person Hossein Vatani    schedule 14.05.2018