在Linux和Unix-like系统中,查看命令执行时间是一项常见的需求,无论是性能分析、脚本调试还是系统监控,都离不开对命令执行时间的精确测量,通过内置的命令和工具,我们可以灵活地获取不同粒度的时间信息,从而更好地优化系统性能和排查问题,本文将详细介绍多种查看命令执行时间的方法,包括使用time命令、/usr/bin/time工具、bash内置时间变量以及结合date命令的技巧,并通过表格对比不同方法的适用场景,最后以FAQs形式解答常见疑问。

使用time命令查看命令执行时间
time是Shell内置的命令,用于统计命令执行时消耗的资源,包括实际时间(real time)、用户态CPU时间(user time)和内核态CPU时间(sys time),实际时间是命令从开始到结束的总耗时,用户态时间是CPU在用户模式下执行命令的时间,内核态时间是CPU在内核模式下执行命令的时间(如系统调用),执行time ls -l,终端会输出类似以下结果:
real 0m0.002s
user 0m0.001s
sys 0m0.001s
这里,real时间是最直观的命令执行耗时,而user和sys时间则反映了CPU的负载情况,需要注意的是,Shell内置的time命令功能相对基础,且不同Shell(如bash、zsh)的输出格式可能略有差异,对于更详细的时间统计(如内存占用、页面错误等),可以使用/usr/bin/time命令,这是一个独立的二进制文件,功能更强大,执行/usr/bin/time -p ls -l,会输出标准化的时间信息,包括real、user和sys,单位为秒。
使用/usr/bin/time获取详细资源统计
/usr/bin/time命令通过不同的选项提供了更丰富的统计信息,使用-v选项可以输出详细的资源使用报告,包括命令的退出状态、用户CPU时间、系统CPU时间、最大内存使用量、页面错误次数、块输入输出操作次数等,以下是一个示例输出:
Command being timed: "ls -l"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 0
Voluntary context switches: 0
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
通过这些信息,可以全面分析命令的资源消耗情况,适用于性能瓶颈排查和资源优化,需要注意的是,/usr/bin/time的路径可能因系统而异,通常位于/usr/bin/或/usr/local/bin/,可通过which time命令确认。

利用bash内置时间变量和$SECONDS
在Shell脚本中,有时需要记录命令或代码块的执行时间,此时可以利用bash内置的$SECONDS变量或time命令结合变量赋值。$SECONDS变量记录了脚本运行的总秒数,
start_time=$SECONDS sleep 3 end_time=$SECONDS echo "执行时间:$((end_time - start_time))秒"
上述脚本会输出“执行时间:3秒”,对于更精确的时间测量,可以使用date命令获取Unix时间戳(秒级或毫秒级),
start_time=$(date +%s.%N) sleep 3 end_time=$(date +%s.%N) echo "执行时间:$(echo "$end_time - $start_time" | bc)秒"
这里,%N选项获取纳秒级时间戳,通过bc计算浮点数差值,实现高精度时间统计。bash的time关键字可以用于统计整个脚本的执行时间,只需在脚本开头添加set -x和time关键字,或使用time ./script.sh执行脚本。
结合time和tee命令保存执行日志
在调试或记录命令执行时间时,可能需要将时间统计结果保存到日志文件中,可以结合time和tee命令实现。

(time ls -l) 2>&1 | tee output.log
上述命令会将ls -l的执行结果和时间统计信息同时输出到终端和output.log文件中。2>&1将标准错误(stderr)重定向到标准输出(stdout),确保time的统计信息也被捕获,这种方法适用于需要长期监控和记录命令执行时间的场景。
不同方法的适用场景对比
为了更直观地比较不同方法的适用场景,以下通过表格进行总结:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
Shell内置time |
简单易用,无需额外安装 | 功能有限,输出格式不统一 | 临时查看命令执行耗时 |
/usr/bin/time |
功能强大,提供详细资源统计 | 路径可能不同,选项较多 | 性能分析、资源监控 |
$SECONDS变量 |
适合脚本内时间记录,无需额外工具 | 精度较低(秒级) | Shell脚本中简单计时 |
date命令 |
高精度(纳秒级),灵活计算 | 需要结合外部工具(如bc) |
需要高精度时间统计的脚本 |
time+tee |
可保存日志,便于长期分析 | 需要处理重定向,可能影响命令输出 | 调试、记录命令执行时间和结果 |
相关问答FAQs
Q1: 为什么time命令输出的real时间比user+sys时间大?
A1: real时间是命令从开始到结束的实际耗时,包括CPU时间、I/O等待时间、上下文切换等所有延迟;而user和sys时间仅表示CPU在用户态和内核态的执行时间总和,当命令涉及大量I/O操作(如文件读写、网络请求)或等待其他资源时,real时间会显著大于user+sys时间,因为CPU在这些时间段内处于空闲状态。
Q2: 如何在脚本中自动选择time命令(优先使用/usr/bin/time)?
A2: 可以通过以下代码实现自动选择,优先使用功能更强大的/usr/bin/time,如果不存在则回退到Shell内置的time:
if command -v /usr/bin/time >/dev/null 2>&1; then
TIME_CMD="/usr/bin/time -v"
else
TIME_CMD="time"
fi
$TIME_CMD ls -l
这样,无论系统是否安装/usr/bin/time,脚本都能正常执行,并尽可能获取详细的时间统计信息。
