Я хотел бы избежать этого, запустив процесс из приложения мониторинга.
В 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) использовать sysconf()
функцию posix , которая, к сожалению, использует жестко запрограммированное значение, скомпилированное в библиотеку 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 будет влиять на точность.
etime=
опечатка? Я могу найти толькоetime
в справочных страницах.=
подавляет заголовок. Попробуйте это без, или попробуйтеps -p $$ -o etime="Silly Header Here"
etimes
себя, так как тогда она машиночитаемаsysconf()
и, следовательно, дает жестко запрограммированное значение из библиотеки C, как уже было сказано, не так ли?Портативный:
т.е. эта оболочка была запущена 30 января и заняла около 6 секунд процессорного времени.
Могут быть более точные или более понятные, но менее портативные способы получения этой информации. Проверьте документацию вашей
ps
команды или вашейproc
файловой системы.Под Linux эта информация живет в
/proc/$pid/stat
.Процессорное время находится в замешательстве; Я не знаю, как случайно найти значение jiffy из оболочки. Время запуска относительно времени загрузки (находится в
/proc/uptime
).источник
sysinfo.c
пакете procps можно: а) включить файл заголовка ядра (и перекомпилировать, если используется другое ядро, б) использовать функцию posix sysconf (), которая, к сожалению, использует жестко запрограммированное значение, скомпилированное в библиотека c или c) запросить ядро, и для этого нет официального интерфейса. Итак, код включает в себя ряд кладжей, по которым он определяет правильное значение. Ух ты.ps
странице руководства указано, чтоtime
это «совокупное время процессора». Я думаю, что ищет ОПetime
, или «истекшее время с начала процесса». pubs.opengroup.org/onlinepubs/000095399/utilities/ps.htmletime
, хотя.X это название процесса
источник
ps -o pid,comm,cmd,start,etime -p X
посмотреть на PID X.ps
принимает-o
параметр, чтобы указать формат вывода, и один из доступных столбцовetime
. Согласно справочной странице:Таким образом, вы можете запустить это, чтобы получить PID и истекшее время каждого процесса:
Если вы хотите, чтобы истекшее время определенного PID (например, 12345), вы можете сделать что-то вроде:
( Edit : оказывается, есть более короткий синтаксис для вышеуказанной команды; см . Ответ mattdm )
источник
Не знаете, почему это еще не было предложено: в Linux вы можете
stat()
использовать каталог / proc / [nnn] для вашего PID.Это поведение явно предназначено для возврата времени запуска процесса, которое оно может выполнять с высоким разрешением и которое ядро может делать точно без хаков jiffies, поскольку ядро может (очевидно) просто проверять соответствующую информацию. Поля доступа, изменения данных и изменения состояния возвращают время начала процесса.
Лучше всего то, что вы можете использовать
stat(1)
в оболочке или соответствующую привязкуstat(2)
из $ favourite_programming_language, так что вам может даже не понадобиться запускать внешний процесс.Обратите внимание, что это не работает с
/usr/compat/linux/proc
FreeBSD; время доступа / изменения / изменения состояния - это текущее время, а время рождения - эпоха UNIX. Довольно глупо, что поддержки нет, если вы спросите меня.источник
stat /proc/4480
это даст вам даты рождения, изменения, изменения и доступа к процессу. Если вам нужен идентификатор процесса, просто используйте "top"Если вы можете запустить время и затем выполнить команду, вы получите именно то, что вы ищете. Вы не можете сделать это против уже запущенной команды.
[0]% времени сна 20
сон 20 0.00s пользователь 0.00s система 0% процессор 20.014 всего
источник
Вы можете получить время начала процесса, посмотрев на
stat
файл статистики, сгенерированный имproc
, отформатировав егоdate
и вычтя из текущего времени:echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
где
13494
ваш процесс PIDисточник
$ ps -eo lstart
получить время начала$ ps -eo etime
получить длительность / истекшее время61819 - это идентификатор процесса.
источник
Время в секундах:
expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
источник
date +%s --date="now - $( stat -c%X /proc/$$