关于Linux上的计时程序有一个小问题:time命令允许
衡量一个程序的执行时间:
[ed@lbox200 ~]$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.004s
这很好。但是如果我试图将输出重定向到一个文件,它会失败。
[ed@lbox200 ~]$ time sleep 1 > time.txt
real 0m1.004s
user 0m0.001s
sys 0m0.004s
[ed@lbox200 ~]$ cat time.txt
[ed@lbox200 ~]$
我知道还有其他时间的实现有-o选项来写文件,但是
我的问题是关于没有这些选项的命令。
有什么建议吗?
如果您关心命令的错误输出,您可以在使用内置的time命令时将它们像这样分开。
{ time your_command 2> command.err ; } 2> time.log
or
{ time your_command 2>1 ; } 2> time.log
正如您所看到的,命令的错误会被保存到一个文件中(因为stderr用于表示时间)。
不幸的是,你不能将它发送到另一个句柄(如3>&2),因为它在{…}之外不再存在了。
也就是说,如果你可以使用GNU时间,就按照tim Ludwinski说的去做。
\time -o time.log command
如果你不想触及原始进程的stdout和stderr,你可以将stderr重定向到文件描述符3和返回:
$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out
real 0m0.009s
user 0m0.004s
sys 0m0.000s
你可以使用它作为包装器(例如cronjobs)来监视运行时:
#!/bin/bash
echo "[$(date)]" "$@" >> /my/runtime.log
{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log