Дорогой друг и коллеги
Приятно быть здесь, в 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
хорошо спасибо за помощь
Если дроби вам не нужны, иногда полезно иметь фактические временные метки. trap date debug
с помощью одного вызова в верхней части скрипта, но вам остается выяснить различия. Применение той же логики к первому решению Simonare будет аналогичным: trap 'echo $SECONDS; SECONDS=0' debug
, что также может быть легко, если дроби не важны.
Я использую утилиты ttic
и ttoc
, написанные суперпользователем и совместно используемые здесь.
для расчета секунд вы можете использовать
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
но не совсем ясно, как мне добавить этот синтаксис в свой код, поэтому, наконец, я получу время, как я объяснил
проверьте мой ответ, пожалуйста
Ха, хорошо, позволь мне проверить это на моей машине, пожалуйста, один сувенир
одна небольшая проблема, я вижу, что многие скрипты выполняются в течение 1 секунды, поэтому вывод: Это заняло 0 секунд, но не так логично, чтобы получить значение 0
Вы можете использовать команду 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
почему печатается "\ t"?
Я забыл добавить флаг -e
в эхо, чтобы указать ему печатать символ табуляции.
другое дело, слово "Sec" находится во второй строке, а не в первой строке.
«Sec» во второй строке означает, что, вероятно, есть символ новой строки из вывода time. Вы можете удалить его, используя что-то вроде tr -d '\n'
.
даже я использовал tr -d, Sec - переход на вторую строку
пример - Sec Secrunning скрипта
Я забыл, что вы должны использовать встроенный в bash time
для такого перенаправления. По умолчанию у него не было нужного вам формата, поэтому я использовал / usr / bin / time, что было неверно. Вместо этого вам нужно установить переменную TIMEFORMAT.
не так хорошо, потому что время находится во внутренней оболочке и не распознается, время должно иметь полный путь
Почему внутренняя оболочка не распознает команду времени? Ой, или вы имели в виду TIMEFORMAT? Если вы это имеете в виду, вы можете попробовать экспортировать его или просто указать формат времени прямо перед командой. Хотя, по мне, работает даже при использовании внутренней оболочки. Тогда я не уверен, что происходит на твоей стороне.
Я тестирую это, когда вы указываете только время без полного пути, тогда скрипт не работает, и когда я устанавливаю export TIME = / usr / bin / time, и я устанавливаю TIME внутри, снова мы получаем ту же проблему, что и "sec" вставлен в следующую строку
Вторая небольшая эстетическая проблема заключается в том, что напечатанные значения времени не выравниваются, и это потому, что некоторые имена скриптов короткие, а некоторые длинные, поэтому в этом случае мы получаем печать без выравнивания
Вы используете bash? Не успевает ли красная версия bash? Но да, для захвата только времени, указанного выше, вам понадобится встроенный bash, иначе он не сработает. Это решение использовало встроенную команду времени. Как вам понравился ответ @Simonare?
Для форматирования я бы сказал, что вы можете использовать встроенный printf, но я не знаю, есть ли у вас эти встроенные функции или нет. В любом случае, мне пора идти. Удачи! :)
Хотя он не помещает вывод в ту же строку, это может удовлетворить ваши потребности.
for i in $script_name
do { set -x;
time "$i";
} 2>&1 | grep -Ev '^(user|sys|$)'
done
Команда
time
вычислит время, но вам нужно поработать над форматированием вывода. Версия GNU имеет несколько вариантов форматирования, которые могут вам помочь.