“time” 是一个用于测量指定命令执行所消耗时间及系统资源 的命令行工具,核心输出包括命令执行的实际时间(real)、用户态CPU时间(user)、内核态CPU时间(sys),也可扩展输出内存、IO、上下文切换等资源使用情况,是运维调试、性能优化、任务效率评估的常用工具。
该命令是Linux系统中排查命令/脚本执行效率、定位性能瓶颈的基础工具,可快速评估命令的耗时分布,判断任务是CPU密集型还是IO密集型,也支持自定义输出格式以适配脚本解析、日志统计等场景。
time [选项] <命令> [命令参数]常用选项
说明:Linux中有两个版本的time:① bash/ksh等shell的内置time(基础功能,无扩展选项);② /usr/bin/time(独立可执行文件,功能更丰富)。可通过
type time区分(输出time is a shell builtin为内置版,time is /usr/bin/time为系统版),以下选项若无特殊标注,默认指/usr/bin/time。
-v:"verbose",详细输出模式,除核心时间外,还显示命令执行的内存占用、IO操作、上下文切换、信号量等资源统计,例如/usr/bin/time -v ls -l /输出ls命令的完整资源消耗明细。-f <格式字符串>:"format",自定义输出格式(仅系统版支持),通过占位符定义输出内容,例如/usr/bin/time -f "Real: %e s, User: %U s, Sys: %S s" sleep 1自定义时间输出样式。-o <文件>:"output",将time的统计结果写入指定文件(而非终端),例如/usr/bin/time -o time.log ls -R /,把ls递归遍历根目录的耗时写入日志文件。-a:"append",配合-o使用,将输出追加到文件末尾(而非覆盖),例如/usr/bin/time -a -o perf.log ./test.sh,多次执行脚本时保留所有耗时记录。-p:"portability",兼容POSIX标准格式输出,仅输出real、user、sys的秒数(空格分隔),内置time和系统版均支持,例如time -p find / -name "*.log",输出格式为real 10.23\nuser 0.56\nsys 1.89。--help:显示/usr/bin/time的帮助信息,包含所有选项及格式占位符说明(内置time无此选项,需执行help time查看)。--version:显示/usr/bin/time的版本信息(内置time无此选项)。
参考示例
示例1:基础使用(测量单命令耗时) 执行
time ls -l /etc,终端先输出ls命令的结果,随后输出time的核心统计信息,典型输出:total 1240 drwxr-xr-x 2 root root 4096 Sep 28 14:20 acpi ...(省略文件列表) real 0m0.092s user 0m0.015s sys 0m0.077s字段说明:real(实际耗时)= 从命令启动到结束的墙钟时间;user(用户态CPU时间)= 命令在用户空间占用的CPU时长;sys(内核态CPU时间)= 命令在内核空间执行系统调用的CPU时长。
示例2:区分shell内置time和系统版time 执行
type time查看版本:若输出
time is a shell builtin,为shell内置版(功能精简);若需使用系统版,执行
/usr/bin/time ls -l(或\time ls -l,反斜杠跳过shell内置),系统版支持-v/-f等扩展选项。
示例3:自定义输出格式(仅系统版) 执行
/usr/bin/time -f "命令:%C\n实际耗时:%e 秒\nCPU占用率:%P\n最大内存:%M KB" sleep 2,自定义输出维度,典型结果:命令:sleep 2 实际耗时:2.00 秒 CPU占用率:0% 最大内存:1248 KB常用占位符:%C(命令名称+参数)、%e(real时间,秒)、%U(user时间,秒)、%S(sys时间,秒)、%P(CPU占用百分比)、%M(最大驻留内存,KB)。
示例4:详细输出资源使用情况(仅系统版) 执行
/usr/bin/time -v du -sh /var,输出du命令的完整资源统计,包含内存、IO、上下文切换等信息:Command being timed: "du -sh /var" User time (seconds): 0.14 System time (seconds): 0.91 Percent of CPU this job got: 19% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.62 Maximum resident set size (kbytes): 1048 Minor (reclaiming a frame) page faults: 286 ...(省略IO、信号量等信息)可通过这些信息判断命令是否因内存不足、IO阻塞导致耗时过长。
示例5:将耗时结果写入文件(仅系统版) 执行
/usr/bin/time -o script_perf.log ./backup.sh,backup.sh执行完成后,耗时信息覆盖写入script_perf.log;若需追加记录,执行/usr/bin/time -a -o script_perf.log ./backup.sh。示例6:兼容POSIX格式输出(便于脚本解析) 执行
time -p find /tmp -type f,输出简化格式:real 3.52 user 0.23 sys 1.01脚本中可提取real时间:
time -p find /tmp -type f 2>&1 | awk '/real/ {print $2}',仅获取实际耗时数值。示例7:测量带参数的脚本执行耗时 执行
time bash deploy.sh prod,测量部署脚本以prod为参数执行的耗时,输出:生产环境部署完成! real 1m25.78s user 0m11.24s sys 0m6.15s可快速评估脚本整体效率,判断是否存在优化空间(如慢IO、冗余命令)。
示例8:判断任务类型(CPU/IO密集型)
CPU密集型:user+sys ≈ real,例如
time md5sum large_file.iso,若real=10s、user=9.6s、sys=0.3s,说明耗时主要在CPU计算;IO密集型:user+sys ≪ real,例如
time cp large_file.iso /mnt/usb,若real=65s、user=0.3s、sys=3.1s,说明耗时主要在IO等待。
示例9:批量测量多个命令的耗时 编写批量测试脚本:
#!/bin/bash # 定义待测试的命令列表 commands=( "ls -l /etc" "find /var/log -name '*.log' -mtime -1" "du -sh /home" ) # 遍历执行并测量耗时 for cmd in "${commands[@]}"; do echo -e "\n=== 执行命令:$cmd ===" time -p bash -c "$cmd" echo "------------------------" done执行脚本后,依次输出每个命令的耗时,便于对比不同操作的效率。
示例10:测量管道命令的整体耗时 若需测量整个管道的总耗时,需用括号将管道作为整体:
time (ls -R / | grep ".conf");若仅测量管道中单个命令,执行ls -R / | time grep ".conf"(仅测量grep耗时)。 注:time的输出默认到stderr,需区分命令输出(stdout)和time统计(stderr)。
说明:① time测量的real时间受系统负载影响,同一命令多次执行结果可能略有差异,建议多次测量取平均值;② 内置time的输出默认到stderr,/usr/bin/time可通过
-o控制输出位置;③ 若仅需粗略计时,可使用date脚本(start=$(date +%s); ./test.sh; end=$(date +%s); echo "耗时:$((end-start))秒"),但time精度更高(毫秒级);④ time无法直接测量后台进程,需先等待进程结束(如time wait %1,%1为后台进程ID);⑤ 测量超长时间任务时,建议结合nohup使用,避免终端断开导致统计丢失。