time命令搭配nohup执行Firefox源码构建命令未生成耗时日志的问题求助
time命令搭配nohup执行Firefox源码构建命令未生成耗时日志的问题求助
嗨,我来帮你梳理下这个问题的原因和解决办法~
为什么你的命令没生成耗时报告?
问题出在**time命令的输出流向**和你重定向的范围上:
- 不管是bash等shell的内置
time,还是系统的外部time命令,它的耗时统计信息默认都是输出到标准错误流(stderr),而不是标准输出(stdout)。 - 你之前的命令
time nohup ./mach build > my_log.log &里,>只重定向了nohup和./mach build的标准输出到日志文件,但time自己的stderr输出,以及nohup可能产生的stderr内容,都直接打印到你执行命令的终端了,根本没进到my_log.log里。 - 再加上你用
&把命令后台执行,这些stderr输出可能直接被终端忽略,或者你没注意到终端的输出,自然在日志里找不到耗时信息。
怎么解决?
根据你的需求,有两种常用的处理方式:
1. 把构建日志和耗时信息合并到同一个文件
用命令组或者子shell把time和后续命令包起来,统一重定向所有输出(包括time的stderr)到日志文件:
# 用子shell的写法 (time nohup ./mach build > my_log.log 2>&1) 2>> my_log.log & # 或者用命令组的写法(更高效,不用创建子shell) { time nohup ./mach build > my_log.log 2>&1; } 2>> my_log.log &
解释一下:
2>&1是把nohup和构建命令的stderr重定向到stdout,一起写入my_log.log。- 外层的
2>> my_log.log是把time命令输出的stderr追加到同一个日志文件里。 &让整个命令后台执行,不占用终端。
2. 把耗时信息单独存到另一个文件
如果想把构建日志和耗时统计分开,只需要把time的stderr重定向到单独的文件即可:
(time nohup ./mach build > my_log.log 2>&1) 2> build_time.log &
这样my_log.log里是完整的构建过程日志,build_time.log里只会有time输出的耗时统计(比如real、user、sys时间)。
额外小技巧:用外部time命令更直接
如果你的系统里有外部time命令(比如/usr/bin/time),可以直接用它的-o选项指定输出文件,写法更简洁:
/usr/bin/time -o build_time.log nohup ./mach build > my_log.log 2>&1 &
这个命令会直接把耗时统计写入build_time.log,构建日志则进my_log.log,非常直观。
备注:内容来源于stack exchange,提问作者Kentuk
相关产品推荐
相关产品推荐

