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

Я хотел бы избежать этого, запустив процесс из приложения мониторинга.

201 голос | спросил Tshepang 23 FebruaryEurope/MoscowbWed, 23 Feb 2011 00:14:32 +0300000000amWed, 23 Feb 2011 00:14:32 +030011 2011, 00:14:32

6 ответов


255

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

ps -o etime = -p "$$"

Где $$ - это идентификатор процесса, который вы хотите проверить. Это вернет прошедшее время в формате [[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 ) - время начала процесса. Это, к сожалению, указано как время в jiffies (произвольный счетчик времени, используемый в ядре Linux) с момента загрузки системы. Поэтому вам нужно определить время загрузки системы (из /proc /stat), количество jiffies в секунду в этой системе, а затем выполнить математику, чтобы получить прошедшее время в полезной формат.

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

Так что удобно, что ps делает это все для вас. :)

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

stat -c% X /proc /$$

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

ответил mattdm 23 FebruaryEurope/MoscowbWed, 23 Feb 2011 00:20:48 +0300000000amWed, 23 Feb 2011 00:20:48 +030011 2011, 00:20:48
32

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

% ps -o stime, time $$
STIME TIME
30 января 00:00:06

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

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

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

awk '{print "CPU time:" $ 14 + $ 15; print "время начала:" $ 22} '/proc /$$ /stat

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

ответил Gilles 23 FebruaryEurope/MoscowbWed, 23 Feb 2011 00:31:00 +0300000000amWed, 23 Feb 2011 00:31:00 +030011 2011, 00:31:00
16
ps -eo pid, comm, cmd, start, etime | grep -i X

X - это имя процесса

ответил mezi 28 PM000000120000005931 2013, 12:11:59
12

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

  

etime - прошедшее время с момента запуска процесса в виде [[dd-] hh:] mm: ss.

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

$ ps -eo pid, etime

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

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

( Изменить ). Оказывается, для приведенной выше инструкции есть более короткий синтаксис: см. ответ mattdm )

ответил Michael Mrozek 23 FebruaryEurope/MoscowbWed, 23 Feb 2011 00:20:50 +0300000000amWed, 23 Feb 2011 00:20:50 +030011 2011, 00:20:50
3

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

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

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

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

ответил i336_ 8 Jam1000000amSun, 08 Jan 2017 02:57:25 +030017 2017, 02:57:25
2

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

[0]% времени сна 20

sleep 20 0.00s user 0.00s system 0% cpu 20.014 total

ответил slashdot 25 FebruaryEurope/MoscowbFri, 25 Feb 2011 20:56:03 +0300000000pmFri, 25 Feb 2011 20:56:03 +030011 2011, 20:56:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132