记录后台作业执行时间

记录后台作业执行时间

我有一个在后台执行的脚本,并使用如下命令捕获所有输出:

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

[这假设您希望 to 的输出time也转到log.txt,这从您的问题中不清楚]

只是不要使用nohup

nohup没有做任何特别的事情,只是忽略SIGHUP信号,将 stdout 和 stderr 重定向到文件,并且 - 仅在某些变体中,例如nohup来自 GNU coreutils - 将标准输入从/dev/null打开的位置重定向只写模式。

您可以轻松地从 shell 完成所有这些操作:

{ 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..."

相关内容