Как установить таймер для каждого запускаемого скрипта

Дорогой друг и коллеги

Приятно быть здесь, в stack overflow на лучшем крутом сайте

В / tmp / scripts у нас есть около 128 скриптов, которые выполняют множество тестов.

В виде

verify_dns.sh
verify_ip.sh
verify_HW.sh

И так далее

мы решили запустить все скрипты в текущей папке - / tmp / scfipt со следующим кодом

script_name=` find /tmp/scripts  -maxdepth 1  -type f -name "verify_*"   -exec basename {} \; `

for i in $script_name
do
  echo running the script - $i
  /tmp/scripts/$i
done

Итак, вывод такой

running the script - verify_dns.sh
running the script - verify_ip.sh
.
.

Что мы хотим добавить - это возможность печатать время выполнения скрипта.

В следующем примере

running the script - verify_dns.sh   - 16.3 Sec
running the script - verify_ip.sh    - 2.5 Sec
.
.

Мой вопрос, как мы можем добавить эту возможность в мой код?

Примечание - версия ОС - это redhat 7.2

Команда time вычислит время, но вам нужно поработать над форматированием вывода. Версия GNU имеет несколько вариантов форматирования, которые могут вам помочь.

karakfa 18.12.2018 23:20

хорошо спасибо за помощь

Judy 18.12.2018 23:34

Если дроби вам не нужны, иногда полезно иметь фактические временные метки. trap date debug с помощью одного вызова в верхней части скрипта, но вам остается выяснить различия. Применение той же логики к первому решению Simonare будет аналогичным: trap 'echo $SECONDS; SECONDS=0' debug, что также может быть легко, если дроби не важны.

Paul Hodges 18.12.2018 23:35

Я использую утилиты ttic и ttoc, написанные суперпользователем и совместно используемые здесь.

KamilCuk 18.12.2018 23:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
204
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

SECONDS=0 ; 
your_bash_script ; 
echo $SECONDS

для более точного расчета

start=$(date +'%s%N') 
your_shell_script.sh
echo "It took $((($(date +'%s%N') - $start)/100000)) miliseconds"

для функции внутреннего времени

time your_shell_script.sh

Обновлено: пример предоставлен для OP

for i in $script_name
do
  echo running the script - $i
  start=$(date +'%s%N')
  /tmp/scripts/$i
  echo "It took $((($(date +'%s%N') - $start)/100000)) miliseconds"
done

for i in $script_name
do
  echo running the script - $i
  time /tmp/scripts/$i
done

но не совсем ясно, как мне добавить этот синтаксис в свой код, поэтому, наконец, я получу время, как я объяснил

Judy 18.12.2018 23:20

проверьте мой ответ, пожалуйста

Derviş Kayımbaşıoğlu 18.12.2018 23:22

Ха, хорошо, позволь мне проверить это на моей машине, пожалуйста, один сувенир

Judy 18.12.2018 23:24

одна небольшая проблема, я вижу, что многие скрипты выполняются в течение 1 секунды, поэтому вывод: Это заняло 0 секунд, но не так логично, чтобы получить значение 0

Judy 18.12.2018 23:36

Вы можете использовать команду time, чтобы узнать, сколько времени потребовалось каждому:

TIMEFORMAT = "%E"
for i in $script_name
do
  echo -en "running the script - $i\t - "
  exec 3>&1 4>&2
  var=$( { time /tmp/scripts/$i 1>&3 2>&4; } 2>&1)  # Captures time only
  exec 3>&- 4>&-

  echo "$var Sec"
done

Это работает независимо от того, производят ли ваши скрипты какой-либо вывод / stderr. См. Эту ссылку для захвата только вывода времени: получить значения из команды 'time' через скрипт bash

вывод такой - запуск скрипта - verify_dns.sh - \ t1.39

Judy 18.12.2018 23:53

почему печатается "\ t"?

Judy 18.12.2018 23:54

Я забыл добавить флаг -e в эхо, чтобы указать ему печатать символ табуляции.

Tyler Marshall 18.12.2018 23:54

другое дело, слово "Sec" находится во второй строке, а не в первой строке.

Judy 18.12.2018 23:54

«Sec» во второй строке означает, что, вероятно, есть символ новой строки из вывода time. Вы можете удалить его, используя что-то вроде tr -d '\n'.

Tyler Marshall 18.12.2018 23:56

даже я использовал tr -d, Sec - переход на вторую строку

Judy 19.12.2018 00:10

пример - Sec Secrunning скрипта

Judy 19.12.2018 00:12

Я забыл, что вы должны использовать встроенный в bash time для такого перенаправления. По умолчанию у него не было нужного вам формата, поэтому я использовал / usr / bin / time, что было неверно. Вместо этого вам нужно установить переменную TIMEFORMAT.

Tyler Marshall 19.12.2018 00:19

не так хорошо, потому что время находится во внутренней оболочке и не распознается, время должно иметь полный путь

Judy 19.12.2018 00:25

Почему внутренняя оболочка не распознает команду времени? Ой, или вы имели в виду TIMEFORMAT? Если вы это имеете в виду, вы можете попробовать экспортировать его или просто указать формат времени прямо перед командой. Хотя, по мне, работает даже при использовании внутренней оболочки. Тогда я не уверен, что происходит на твоей стороне.

Tyler Marshall 19.12.2018 00:29

Я тестирую это, когда вы указываете только время без полного пути, тогда скрипт не работает, и когда я устанавливаю export TIME = / usr / bin / time, и я устанавливаю TIME внутри, снова мы получаем ту же проблему, что и "sec" вставлен в следующую строку

Judy 19.12.2018 00:34

Вторая небольшая эстетическая проблема заключается в том, что напечатанные значения времени не выравниваются, и это потому, что некоторые имена скриптов короткие, а некоторые длинные, поэтому в этом случае мы получаем печать без выравнивания

Judy 19.12.2018 00:36

Вы используете bash? Не успевает ли красная версия bash? Но да, для захвата только времени, указанного выше, вам понадобится встроенный bash, иначе он не сработает. Это решение использовало встроенную команду времени. Как вам понравился ответ @Simonare?

Tyler Marshall 19.12.2018 00:38

Для форматирования я бы сказал, что вы можете использовать встроенный printf, но я не знаю, есть ли у вас эти встроенные функции или нет. В любом случае, мне пора идти. Удачи! :)

Tyler Marshall 19.12.2018 00:39

Хотя он не помещает вывод в ту же строку, это может удовлетворить ваши потребности.

for i in $script_name
do { set -x;
     time "$i";
   } 2>&1 | grep -Ev '^(user|sys|$)'
done

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