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

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

<p>в linux с <code>ps</code> from <code>procps(-ng)</code> (и в большинстве других систем, поскольку это указано в posix):</p><pre><code>ps -o etime= -p "$$" где $$</code> - это pid процесса, который вы хотите проверить. это вернет истекшее время в формате <code>[[dd-]hh:]mm:ss</code>.</p><p>использование <code>-o etime</code> сообщает <code>ps</code>, что вам просто нужно поле прошедшего времени, а <code>=</code> в конце этого подавляет заголовок (без, вы получаете строку, которая говорит <code>elapsed</code>, а затем время на следующая строка, с, вы получите только одну строку со временем).</p><p>или, с более новыми версиями набора инструментов procps-ng (3.3.0 или выше) в linux или во freebsd 9.0 или выше (и, возможно, в других), используйте:</p><pre><code>ps -o etimes= -p "$$" (с добавленным s) для форматирования времени в секундах, что более полезно в сценариях.в linux программа ps получает это из /proc/$$/stat</code>, где одно из полей (см. <code>man proc</code>) является временем запуска процесса. к сожалению, это указывается как время в jiffies (произвольный счетчик времени, используемый в ядре linux) с момента загрузки системы. таким образом, вы должны определить время загрузки системы (из <code>/proc/stat</code>), количество jiffies в секунду в этой системе, а затем выполнить математические расчеты, чтобы получить истекшее время в полезном формате.</p><p>оказывается, нелепо сложно найти значение hz (т. е. джиффы в секунду). из комментариев в <code>sysinfo.c</code> в пакете procps можно a) включить файл заголовка ядра и перекомпилировать, если используется другое ядро, b) использовать функцию posix <code>sysconf()</code>, которая, к сожалению, использует жестко запрограммированный код значение, скомпилированное в библиотеку c, или c) запрашивает ядро, но официального интерфейса для этого нет. итак, код <code>ps</code> включает серию кладжей, по которым он определяет правильное значение. ух ты.</p><p>поэтому удобно, что <code>ps</code> сделает все за вас. :)</p><p>как отмечает пользователь @ 336\_, в linux (это не переносимо) вы можете использовать команду <code>stat</code>, чтобы просмотреть даты доступа, изменения или изменения состояния для каталога <code>/proc/$$ (где снова $$</code> - это процесс интерес). все три числа должны быть одинаковыми, поэтому</p><pre><code>stat -c%x /proc/$$ даст вам время начала процесса $$</code> в секундах с начала эпохи. это все еще не совсем то, что вы хотите, так как вам все еще нужно сделать математику, чтобы вычесть это из текущего времени, чтобы получить истекшее время - я думаю, что-то вроде <code>date +%s --date="now - $( stat -c%x /proc/$$ ) seconds" будет работать, но это немного неуклюже. одним из преимуществ возможно является то, что если вы используете вывод в длинном формате, например -c%x вместо -c%x, вы получите большее разрешение, чем целое число секунд. но, если вам это нужно, вы, вероятно, должны использовать подход аудита процессов, потому что время выполнения команды stat будет влиять на точность.

портативный:% ps -o stime,time $$ stime time jan30 00:00:06 то есть, что shell была запущена 30 января и заняла около 6 секунд процессорного времени.могут быть более точные или более понятные, но менее портативные способы получения этой информации. проверьте документацию вашей команды ps или вашей файловой системы proc.под linux эта информация живет в <a href="http://www.kernel.org/doc/documentation/filesystems/proc.txt">/proc/$pid/stat</code></a> .</p><pre><code>awk '{print "cpu time: " $14+$15; print "start time: " $22}' /proc/$$/stat процессорное время находится в замешательстве; я не знаю, как найти значение jiffy в shell. время запуска относительно времени загрузки (находится в /proc/uptime).

ps -eo pid,comm,cmd,start,etime | grep -i x x это название процесса

ps берет -o возможность указать формат вывода, и один из доступных столбцов - etime. согласно справочной странице:<blockquote> etime - время, прошедшее с начала процесса, в формате [[dd-] чч:] мм: сс. </blockquote>таким образом, вы можете запустить это, чтобы получить pid и истекшее время каждого процесса:$ ps -eo pid,etime </code></pre><p>если вы хотите, чтобы истекшее время определенного pid (например, 12345), вы можете сделать что-то вроде:</p><pre><code>$ ps -eo pid,etime | awk '/^12345/ {print $2}' </code></pre><p>(<strong> edit </strong>: выясняется, что у приведенной выше команды есть более короткий синтаксис; см. <a href="https://unix.stackexchange.com/questions/7870/how-to-check-how-a-long-a-program-has-been-running/7871#7871">ответ mattdm</a> )</p>

<p>не знаете, почему это еще не было предложено: <strong>в linux</strong> вы можете <code>stat()</code> каталог/proc/[nnn] для вашего pid.</p><p>это поведение явно предназначено для возврата времени запуска процесса, которое оно может выполнять с высоким разрешением и которое ядро может делать точно без хаков jiffies, поскольку ядро может (очевидно) просто проверять соответствующую информацию. поля доступа, изменения данных и изменения состояния возвращают время начала процесса.</p><p>лучше всего то, что вы можете использовать <code>stat(1)</code> в командной консоли или соответствующую привязку к <code>stat(2)</code> из $ favourite_programming_language, так что вам даже может не понадобиться запускать внешний процесс.<strong> примечание </strong> что это делает <strong>не</strong> работает с /usr/compat/linux/proc во freebsd; время доступа/изменения/изменения состояния - это текущее время, а время рождения - эпоха unix. довольно глупо, что поддержки нет, если вы спросите меня.

если вы можете запустить время и затем выполнить команду, вы получите именно то, что вы ищете. вы не можете сделать это против уже запущенной команды.[0]% времени сна 20сон 20 0.00s пользователь 0.00s система 0% процессор 20.014 всего

$ ps -eo lstart</code> получить время начала</p><p><code>$ ps -eo etime получить длительность/истекшее время$ ps -eo pid,lstart,etime | grep 61819 pid started elapsed 61819 mon sep 17 03:01:35 2018 07:52:15 </code></pre><p>61819 - это идентификатор процесса.</p>

<p>время в секундах: <code>expr $(date +"%s") - $(stat -c%x /proc/<pid here>)</code></p>

<p>вы можете узнать время начала процесса, посмотрев на <code>stat</code> файла статистики, созданного <code>proc</code>, отформатируйте его с помощью <code>date</code> и вычтите его из текущего времени:</p><p><code>echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep modify | sed 's/modify: //')" +%s) ))</code></p><p>где <code>13494</code> это pid вашего процесса</p>