Получить время выполнения процесса в секундах

Попытка:

wget http://mymusic.store.com/musicfoo.mp3 && mplayer musicfoo.mp3

&& означает, "после того как команда левой стороны успешно завершилась". Это предполагает, что команда левой стороны не разветвляет или использует нестандартные значения статуса выхода. Я сомневаюсь, что wget делает последнего, и, пока Вы не используете -b переключатель, это не должно делать первого также.

2
13.04.2017, 15:36
5 ответов

EVAL может помочь этому случаю ...

~ $ $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ expr 1 \* 2
expr: syntax error
~ $ eval $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ eval expr 1 \* 2
+ expr 1 * 2
2

, но может быть лучше посмотреть вверх / proc / $ pid / stat на Linux.

pid=1155
hz=$(getconf CLK_TCK)
uptime=$(awk '{print $1}' < /proc/uptime)
starttime=$(awk '{print $22}' < /proc/$pid/stat)
echo $(( ${uptime%.*} - $starttime / $hz ))

Если / usr / bin / getcconf недоступно, вам нужно найти вашу систему CLK_TCK (или user_hz ) значение. Я думаю, что вы можете предположить, что это 100 в большинстве случаев.

5
27.01.2020, 21:52

POSIX one:

$ { printf %s insertedtext; cat <./input_file; } >/tmp/output_file
$ mv -- /tmp/output_file ./input_file
-121--65928-

Из руководства ( man bash ):

При выходе из оболочки входа bash считывает и выполняет команды из файлов ~/.bash _ logout и/ , если файлы существуют.

Имеется еще один ответ на U & L SE в сообщениях входа в систему.

-121--125516-

Что смущает, я, кажется, не смог проверить так полностью, как я думал. Оказывается, что изменение того, что я разместил в своем вопросе, чтобы он содержал только два побега (\\* ), делает его прекрасным.

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\* 60 + \2/p")
$(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\* 60 + \2/p")
+ /opt/bin/busybox ps -o pid,etime
+ sed -n s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \* 60 + \2/p
+ expr 293 * 60 + 54
17634

Обратите внимание, что я также интегрировал grep в sed с подходом -n 's///p' (глобальный n o-print и затем p rint on match).

Спасибо @ yaegashi, что заставил меня повторить попытку \\...

1
27.01.2020, 21:52

Процесс от препарата составляет 16752 (который вы, кажется, сможете выяснить)

expr $(date +%s) - $(stat -c %Y /proc/16752/environ )

, где

  • дата +% S является текущей датой вторым, после эпохи
  • stat -c% y / proc / 16752 / Enviry - «Дата создания» / ProC / 16752 / Enviry, это момент, когда был запущен ProC # 16752

Редактировать:

  • Может быть, ProC / $ PID / Environ - неправильный псевдо-файл, / ProC / $ PID / EXE .

  • Если время изменилось на хосте, оба результата из PS -P $ PID -H -O etime и Timestamp от / proc / $ pid / exe , вероятно, будут неправы. (не уверены, как проверить это).

1
27.01.2020, 21:52

@yaegashi правильно применил подход, но мой вызов sed , кажется, вводит необходимость в третьем \ .

root@embedded:/data# set -vx
root@embedded:/data# echo Process Uptime: $(eval $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *${APP_PID} \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\\* 60 + \2/p"))
echo Process Uptime: $(eval $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *${APP_PID} \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\\* 60 + \2/p"))
+ /opt/bin/busybox ps -o pid,etime
+ sed -n s/ *1156 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\* 60 + \2/p
+ eval expr 2 \* 60 + 46
+ expr 2 * 60 + 46
+ echo Process Uptime: 166
Process Uptime: 166

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

0
27.01.2020, 21:52

Это awk-скрипт, который преобразует вывод 0 -00 :00 :00 в секунды. Используется так...

ps -eo pid,time,user,comm | awk '{print $1"|"$2"|"$3"|"$4$5$6$7$8$9$10}' | awk -f _os_return_process_time_in_seconds.awk

Вот сценарий. Просто написал если для другой цели. Может еще есть проблемы.

BEGIN {
   FS="|"
}

{
   pid=$1
   time=$2
   user=$3
   comm=$4
   split_count=split($2,days_array,"\-")
   if ( split_count == 2 ) {
      days=days_array[1]
      hr_min_sec=days_array[2]
   }
   else {
      days=0
      hr_min_sec=days_array[1]
   }
   split_count=split(hr_min_sec,hr_min_sec_array,":")
   if ( split_count == 3 ) {
      hours=hr_min_sec_array[1]
      minutes=hr_min_sec_array[2]
      seconds=hr_min_sec_array[3]
   }
   else if ( split_count == 2 ) {
      hours=0
      minutes=hr_min_sec_array[1]
      seconds=hr_min_sec_array[2]
   }
   else if ( split_count == 1 ) {
      hours=0
      minutes=0
      seconds=hr_min_sec_array[1]
   }
   total_seconds=(days*24*60*60)+(hours*60*60)+(minutes*60)+(seconds)
   print pid"|"total_seconds"|"user"|"comm
}
0
27.01.2020, 21:52

Теги

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