it-swarm-ru.tech

Как проверить, как долго запущен процесс?

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

250
tshepang

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

Оказывается, нелепо сложно найти значение HZ (т. Е. Джиффы в секунду). Из комментариев в sysinfo.c в пакете procps можно 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, вы получите большее разрешение, чем целое число секунд. Но, если вам это нужно, вы, вероятно, должны использовать подход аудита процессов, потому что время выполнения команды stat будет влиять на точность.

324
mattdm

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

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

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

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

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

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

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

36
Gilles 'SO- stop being evil'
ps -eo pid,comm,cmd,start,etime | grep -i X

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

19
mezi

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

etime - время, прошедшее с начала процесса, в формате [[dd-] чч:] мм: сс.

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

$ ps -eo pid,etime

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

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

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

13
Michael Mrozek

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

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

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

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

5
i336_

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

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

сон 20 0.00s пользователь 0.00s система 0% процессор 20.014 всего

2
slashdot

$ 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
Terry wang

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

1
Shardj

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

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

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

1
bobbins