Время выполнения фонового задания журнала

Время выполнения фонового задания журнала

У меня есть скрипт, который я запускаю в фоновом режиме и захватываю все выходные данные с помощью такой команды:

nohup bash -x test.sh < /dev/null > log.txt 2>&1 &

Как узнать, сколько времени ушло на выполнение? Если я попытаюсь использовать timeпосле того, как bash -xполучу ошибку:

/usr/bin/time: /usr/bin/time: cannot execute binary file

Если я попытаюсь его использовать, acctпроцесс не будет зарегистрирован или я не смогу его найти.

решение1

[предполагается, что вы хотите, чтобы вывод timeтакже перешел в log.txt, что не ясно из вашего вопроса]

Просто не используйте nohup.

nohupничего особенного не делает, кроме как игнорирует SIGHUPсигнал, перенаправляет stdout и stderr в файл и --только в некоторых вариантах, например nohupиз GNU coreutils-- перенаправляет stdin из/dev/null открытого втолько для записирежим.

Все это можно легко сделать из оболочки:

{ trap '' HUP; time bash -x your_script args ... ; } > log.txt 2>&1 0>/dev/null &

Или, что безопаснее, если запустить его из скрипта или если вы не планируете когда-либо возвращать команду на передний план с помощью fg:

(trap '' HUP; time bash -x your_script args ... 0>/dev/null &) > log.txt 2>&1

(Вы можете опустить этот параметр, 0>/dev/nullесли вас не интересует эмуляция этой функции GNU nohup).


Конечно, вы можете использовать синтаксический трюк из первого примера с nohup, если по какой-то непостижимой причине вы приписываете nohup магические свойства:

{ time nohup bash -x your_script args ... ; } > log.txt 2>&1 &

решение2

Только timeпроцесс nohup:

$ time nohup bash -x ~/scripts/foo.sh 
nohup: ignoring input and appending output to 'nohup.out'

real    0m10.011s
user    0m0.005s
sys 0m0.006s

foo.shпросто sleep 10в качестве примера.

решение3

Вы можете просто использовать:

time yourscript.sh

Но если это вам не подходит, вы можете обернуть содержимое скрипта следующим образом:

STARTTIME=$(date +%s)
#command block that takes time to complete...
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

Связанный контент