Я люблю использовать time чтобы выяснить, сколько времени потребовалось для выполнения команды, но когда имеешь дело с командами, которые выполняют подкоманды внутри (и предоставляют вывод, который позволяет вам сказать, когда каждая из этих подкоманд начинает выполняться), было бы действительно здорово быть в состоянии сказать, через какое количество секунд (или миллисекунд) запускается конкретная подкоманда.

Когда я говорю подкоманду, на самом деле единственный способ отличить их от внешней стороны - это что-нибудь распечатанное в стандартном виде.

На самом деле, похоже, что это должно быть вариантом time .

2 ответа2

3

было бы здорово узнать, через какое количество секунд (или миллисекунд) запускается конкретная подкоманда

Одна возможность - использовать эту переменную bash :

СЕКУНД

Эта переменная увеличивается до количества секунд с момента запуска оболочки. Присвоение этой переменной сбрасывает счет до присвоенного значения, и расширенное значение становится присвоенным значением плюс количество секунд с момента присвоения.

Чтобы объединить это с выходным потоком, рассмотрим этот специальный скрипт, который добавляет временную метку к каждой строке ввода:

$ cat timestamp-output
#!/bin/bash
while read line
do
  printf "%05d %s\n" $SECONDS "$line"
done

И передайте вывод вашего скрипта в этот скрипт.

$ your-script | timestamp-output

Пример:

$ cat your-script
#!/bin/bash
for i in 1 2 3 4
do
  echo "step $i started";
  sleep $(($RANDOM%10));
done

$ your-script | timestamp-output

Выход:

00000 шаг 1 начался
00002 шаг 2 начался
00010 шаг 3 начался
00015 шаг 4 начался


Это можно уточнить, чтобы помечать метками времени только выходные строки, которые сигнализируют о начале подкоманды, предполагая, что они могут быть grep'ed:

#!/bin/bash
regex="^start of command"
while read line
do
 if [[ "$line" =~ $regex ]]; then
   printf "%05d %s\n" $SECONDS "$line"
 else
   echo "$line"
 fi
done

Пример скрипта:

#!/bin/bash
for i in 1 2 3 4
do
  echo "start of command: $i";
  echo some output
  echo other output
  sleep $(($RANDOM%10));
done

Образец вывода:

00000 start of command: 1
some output
other output
00002 start of command: 2
some output
other output
00006 start of command: 3
some output
other output
00008 start of command: 4
some output
other output
1

Если вам нужно выяснить, когда начнут выполняться дочерние процессы, вы можете использовать strace -f -tt и проанализировать вывод, или, возможно, запустить собственный сценарий, чтобы сделать это за вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .