Монитор и время процесс, который уже выполняет и экономит общее время выполнения в файл

У меня есть несколько различных процессов, которые работали в течение довольно долгого времени (200 ч). Я просто понял, что забыл использовать time команда для получения общего времени выполнения в конце.

Это процессы, которыми я интересуюсь:

$ pidof perl
5897 5895 5890 5885 5797

Эти процессы в настоящее время работают и после того как они заканчивают, я хочу знать, сколько времени это взяло их для окончания.

Там какой-либо путь состоит в том, чтобы отследить эти процессы и сэкономить общее время выполнения, после того как они сделаны? Или этот вид информации сохраняется где-нибудь Ubuntu?

2
задан 19 February 2018 в 17:15

3 ответа

Если у Вас есть корневой доступ, можно присоединить strace к ним и видеть, когда точно они выходят. Например, я работал sleep 1m на одном терминале, и в другом:

% sudo strace -ttte exit_group -p $(pgrep sleep -n)
strace: Process 11637 attached
1520303315.074384 exit_group(0)         = ?
1520303315.074525 +++ exited with 0 +++

strace опции :

-t         Prefix each line of the trace with the time of day.

-tt        If  given  twice,  the time printed will include the
           microseconds.

-ttt       If given thrice, the time printed will  include  the
           microseconds and the leading portion will be printed
           as the number of seconds since the epoch.

-e expr    A  qualifying expression which modifies which events
           to trace or how to trace them.

можно присоединить несколько PIDs с strace, таким образом, что-то как:

sudo strace -ttte exit_group -p "$(pidof perl)"
1
ответ дан 2 December 2019 в 02:44

Можно контролировать рабочий процесс с, например, PID 12345 и определить его общее время выполнения в секундах, после того как он вышел как это:

startdate="$(ps -o lstart= 12345)" 
while ps 12345 &>/dev/null ; do sleep 1 ; done 
bc <<< "$(date +%s) - $(date -d "$startdate" +%s)"

Это сначала читает lstart свойство процесса с помощью ps, который содержит точную дату начала как строку. Мы должны помнить это, в то время как процесс все еще работает, и сохраните его в переменной оболочки, названной startdate.

Затем мы ожидаем, в то время как процесс все еще работает путем проверки состояния ps 12345 каждую секунду, когда это выйдет с ненулевым состоянием, если никакой процесс соответствия не был найден.

Однажды процесс, из которого выходят, мы вычитаем время начала с текущего времени, оба преобразованные в секунды с Эпохи, с помощью bc и рассматриваем результат как отрезок времени в секундах.

2
ответ дан 2 December 2019 в 02:44

Можно извлечь пользователя и системное время, использованное рабочего процесса из/proc/файла $pid/stat. Например, если Вы хотите получить пользовательское время от процесса 3628, используйте:

echo "scale=2; $(cat /proc/3628/stat | cut -d' ' -f14) / $(getconf CLK_TCK)" | bc

.. вышеупомянутое поле 14 извлечений (пользовательское время в тактах системных часов) и делит это на уровень такта системных часов для вычисления пользовательского времени в секундах к 2 десятичным разрядам.

В течение системного времени, используйте поле 15, например:

echo "scale=2; $(cat /proc/3628/stat | cut -d' ' -f15) / $(getconf CLK_TCK)" | bc

Вот одно решение, которое присваивает переменные оболочки:

PID=1327
USRTIME=`echo "scale=2; $(cat /proc/$PID/stat | cut -d' ' -f14) / $(getconf CLK_TCK)" | bc`
SYSTIME=`echo "scale=2; $(cat /proc/$PID/stat | cut -d' ' -f15) / $(getconf CLK_TCK)" | bc`
echo "Time: USR: $USRTIME SYS: $SYSTIME"
0
ответ дан 2 December 2019 в 02:44

Другие вопросы по тегам:

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