Как проверить, сколько времени процесс работал?

Другое расширение - выполненное управление

Во вторник, 4 ноября 2003, goldwyn Родриг записал:

Кто-либо знает то, что RC (в bashrc/mailrc/...) средства или как это произошло? Я имею в виду, действительно ли это - акроним? Если да, что это обозначает?

'дистанционное управление' обозначает 'выполненное управление' и является конвенцией, принятой от более старых систем Unix.

Поскольку больше информации видит это: http://www.catb.org/~esr/writings/taoup/html/ch10s03.html

[Источник]

249
23.08.2011, 06:14
10 ответов

На Linux с ps от procps(-ng) (и большинство других систем, так как это указано POSIX):

ps -o etime= -p "$$" 

Где $$ PID процесса, который Вы хотите проверить. Это возвратит прошедшее время в формате [[dd-]hh:]mm:ss.

Используя -o etime говорит ps то, что Вы просто хотите поле прошедшего времени, и = в конце этого подавляет заголовок (без, Вы получаете строку, которая говорит ELAPSED и затем время на следующей строке; с, Вы получаете всего одну строку со временем).

Или, с более новыми версиями procps-ng комплекта инструментов (3.3.0 или выше) на Linux или на FreeBSD 9.0 или выше (и возможно другие), используйте:

ps -o etimes= -p "$$"

(с добавленным s) отформатировать время так же, как секунды, который более полезен в сценариях.

На Linux, ps программа получает это от /proc/$$/stat, где одно из полей (см. man proc) время начала процесса. Это, к сожалению, указано, чтобы быть временем в миге (счетчик произвольного момента времени, используемый в ядре Linux) начиная с начальной загрузки системы. Таким образом, необходимо определить время в который загруженная система (от /proc/stat), количество мига в секунду в этой системе, и затем делает математику для получения прошедшего времени в полезном формате.

Это оказывается смехотворно сложным для нахождения значения Гц (то есть, миг в секунду). Из комментариев в sysinfo.c в procps пакете можно A) включать файл заголовка ядрa и перекомпилировать, если другое ядро используется, B) использовать posix sysconf() функция, которая, к сожалению, использует трудно кодированное значение, скомпилированное в библиотеку C или C), спрашивает ядро, но нет никакого официального интерфейса к выполнению этого. Так, ps код включает серию клуджей, которыми он определяет правильное значение. Ничего себе.

Таким образом, это удобно это ps делает это все для Вас.:)

Как пользователь @336_ примечания, на Linux (это не портативно), можно использовать stat управляйте для рассмотрения доступа, модификации или дат изменения состояния каталога /proc/$$ (где снова $$ процесс интереса). Все три числа должны быть тем же, таким образом,

stat -c%X /proc/$$

даст Вам время тот процесс $$ запущенный, в секундах с эпохи. Это все еще не вполне, что Вы хотите, так как все еще необходимо сделать математику для вычитания этого с текущего времени для получения прошедшего времени — я предполагаю что-то как date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" работал бы, но это немного неловко. Одно возможное преимущество - это при использовании вывода длинного формата как -c%x вместо -c%X, Вы получаете большее разрешение, чем секунды целого числа. Но при необходимости в этом необходимо, вероятно, использовать контролирующий процесс подход, потому что синхронизация выполнения команды статистики собирается вмешаться в точность.

322
27.01.2020, 19:27
  • 1
    Привет! etime= опечатка? Я могу только найти etime в страницах справочника. –  Kent Pawar 27.06.2013, 16:01
  • 2
    @KentPawar Это не опечатка. Пустое = подавляет заголовок. Попробуйте его без, или попытка ps -p $$ -o etime="Silly Header Here" –  mattdm 27.06.2013, 16:28
  • 3
    ps-p (pgrep находят)-o etime = –  mafrosis 12.09.2013, 02:07
  • 4
    Хороший. Я предпочитаю etimes самостоятельно, поскольку затем это - машиночитаемый –  Asfand Qazi 15.07.2015, 12:35
  • 5
    @alexmurray, Который просто звонит sysconf() и поэтому дает Вам трудно кодированное значение из библиотеки C, как отмечено, не так ли? –  mattdm 01.04.2016, 04:55

Портативный:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

т.е. та оболочка была запущена 30 января и составила приблизительно 6 секунд процессорного времени.

Там может быть более точным или более parseable, но меньше портативных способов получить эту информацию. Проверьте документацию Вашего ps команда или Ваш proc файловая система.

В соответствии с Linux, эта информация живет в /proc/$pid/stat.

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

Процессорное время находится в миге; я не знаю бесцеремонно, как найти значение мига от оболочки. Время начала относительно времени начальной загрузки (найденный в /proc/uptime).

36
27.01.2020, 19:27
  • 1
    Нахождение значения Гц (то есть, миг в секунду) оказывается смехотворно сложным! Из комментариев в sysinfo.c в procps пакете каждый может a) включать файл заголовка ядрa (и перекомпилируйте, если другое ядро используется, b) используют posix sysconf () функция, которая, к сожалению, использует трудно кодированное значение, скомпилированное в c библиотеку, или c) спросите ядро, и нет никакого официального интерфейса к выполнению этого. Так, код включает серию клуджей, которыми он определяет правильное значение. Ничего себе. –  mattdm 22.02.2011, 23:54
  • 2
    ps страница справочника указывает это time "кумулятивное процессорное время". Я думаю, что искал OP, etime, или "прошедшее время, так как процесс был запущен". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html –  rinogo 23.04.2014, 23:35
  • 3
    Не таким образом "портативный", в конце концов: "PS: stime: ключевое слово, не найденное" на FreeBSD. Это действительно, по крайней мере, поддерживает etime,все же. –  n.st 23.05.2016, 14:34

ps берет a -o опция указать выходной формат и один из доступных столбцов etime. Согласно странице справочника:

etime - прошедшее время начиная с процесса было запущено в форме [[dd-] гд:] mm:ss.

Таким образом можно выполнить это для получения PID и прошедшее время каждого процесса:

$ ps -eo pid,etime

Если Вы хотите прошедшее время конкретного PID (например, 12345), можно сделать что-то как:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

(Редактирование: Повороты там являются более коротким синтаксисом для вышеупомянутой команды; см. ответ mattdm),

13
27.01.2020, 19:27

Если можно выполнить время и затем выполнить команду, Вы получите точно, что Вы ищете. Вы не можете сделать этого против уже рабочей команды.

[0] Время % спит 20

спите 20 0,00 пользователя с 0,00 системных общих количества cpu 20.014 0% с

2
27.01.2020, 19:27
  • 1
    Вы знаете, как я могу сделать это на рабочем процессе, контролирующем, пока это не заканчивается? –  lrkwz 22.11.2012, 00:56
ps -eo pid,comm,cmd,start,etime | grep -i X

X название процесса

18
27.01.2020, 19:27
  • 1
    должен, вероятно, добавить grep-v grep. –  Brian 30.06.2014, 23:07

Не знаю, почему это еще не было предложено: в Linux вы можете stat () каталог / proc / [nnn] для ваш PID.

Это поведение явно предназначено для возврата времени запуска процесса, что оно может делать с высоким разрешением, и что ядро ​​может делать точно без взломов jiffies, поскольку ядро ​​может (очевидно) просто проверять соответствующую информацию. Поля доступа, изменения данных и изменения статуса возвращают время начала процесса.

Лучше всего то, что вы можете использовать stat (1) в оболочке или соответствующую привязку к stat (2) из $ favourite_programming_language, так что вам может даже не понадобиться запустить внешний процесс.

ПРИМЕЧАНИЕ , что это не работает с / usr / compat / linux / proc на FreeBSD; возвращаемое время доступа / модификации / изменения статуса - это текущее время, а время рождения - это эпоха UNIX. Довольно глупо, что поддержки нет, если вы спросите меня.

5
27.01.2020, 19:27

$ ps -eo lstart получить время начала

$ ps -eo etimeполучить продолжительность/прошедшее время

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 — это идентификатор процесса.

2
27.01.2020, 19:27

Прошедшее время в секундах:expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
27.01.2020, 19:27

вы можете получить время начала процесса, взглянув на statфайла статистики, созданного proc, отформатируйте его, используя dateи вычтя его из текущего времени:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

где 13494— pid вашего процесса

1
27.01.2020, 19:27

Удобная функция, основанная на "ps -o etime=" и "bc", помогающая с математикой и ноль дополненных слева чисел.

Дайте ему pid и верните текущие минуты.

function running_time (){
  # correct up to 100 days! #08:28:40 #53:32 #15-01:23:00
  p=$1 ; i=$(ps -o etime= $p) ; i=$(echo $i) ;

  len=${#i}
  [[ $len == 5  ]] && i="00-00:$i" ; [[ $len == 8  ]] && i="00-$i"
  [[ $len == 10 ]] && i="0$i"

  mins=$(echo ${i:0:2}*24*60+${i:3:2}*60+${i:6:2}|bc)
  echo $mins
}
0
17.05.2020, 10:55

Теги

Похожие вопросы