Ответы:
В 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 будет влиять на точность.
=
подавляет заголовок. Попробуйте это без, или попробуйтеps -p $$ -o etime="Silly Header Here"
etimes
себя, так как тогда она машиночитаема
sysconf()
и, следовательно, дает жестко запрограммированное значение из библиотеки C, как уже было сказано, не так ли?
Портативный:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
т.е. эта оболочка была запущена 30 января и заняла около 6 секунд процессорного времени.
Могут быть более точные или более понятные, но менее портативные способы получения этой информации. Проверьте документацию вашей ps
команды или вашей proc
файловой системы.
Под Linux эта информация живет в /proc/$pid/stat
.
awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat
Процессорное время находится в замешательстве; Я не знаю, как случайно найти значение jiffy из оболочки. Время запуска относительно времени загрузки (находится в /proc/uptime
).
sysinfo.c
пакете procps можно: а) включить файл заголовка ядра (и перекомпилировать, если используется другое ядро, б) использовать функцию posix sysconf (), которая, к сожалению, использует жестко запрограммированное значение, скомпилированное в библиотека c или c) запросить ядро, и для этого нет официального интерфейса. Итак, код включает в себя ряд кладжей, по которым он определяет правильное значение. Ух ты.
ps
странице руководства указано, что time
это «совокупное время процессора». Я думаю, что ищет ОП etime
, или «истекшее время с начала процесса». pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
, хотя.
ps -eo pid,comm,cmd,start,etime | grep -i X
X это название процесса
ps -o pid,comm,cmd,start,etime -p X
посмотреть на PID X.
ps
принимает -o
параметр, чтобы указать формат вывода, и один из доступных столбцов etime
. Согласно справочной странице:
etime - время, прошедшее с начала процесса, в формате [[dd-] чч:] мм: сс.
Таким образом, вы можете запустить это, чтобы получить PID и истекшее время каждого процесса:
$ ps -eo pid,etime
Если вы хотите, чтобы истекшее время определенного PID (например, 12345), вы можете сделать что-то вроде:
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
( 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 всего
$ 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 - это идентификатор процесса.
Время в секундах: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
опечатка? Я могу найти толькоetime
в справочных страницах.