У меня есть несколько различных процессов, которые работали в течение довольно долгого времени (200 ч). Я просто понял, что забыл использовать time
команда для получения общего времени выполнения в конце.
Это процессы, которыми я интересуюсь:
$ pidof perl
5897 5895 5890 5885 5797
Эти процессы в настоящее время работают и после того как они заканчивают, я хочу знать, сколько времени это взяло их для окончания.
Там какой-либо путь состоит в том, чтобы отследить эти процессы и сэкономить общее время выполнения, после того как они сделаны? Или этот вид информации сохраняется где-нибудь Ubuntu?
Если у Вас есть корневой доступ, можно присоединить 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 +++
-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)"
Можно контролировать рабочий процесс с, например, 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
и рассматриваем результат как отрезок времени в секундах.
Можно извлечь пользователя и системное время, использованное рабочего процесса из/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"