「time(1)」-

运行程序并总结系统资源使用情况

命令语法格式

time [ -apqvV ] [ -f FORMAT ] [ -o FILE ] COMMAND [ ARGS ]

命令描述

命令time使用任何给定参数ARG运行程序COMMAND。当COMMAND完成时,time显示有关COMMAND使用的资源的信息(默认情况下,在标准错误输出上)。 如果COMMAND以非零状态退出,则time显示警告消息和退出状态。

命令time从字符串FORMAT中确定显示有关COMMAND使用的资源的信息。如果在命令行上未指定格式,但设置了TIME环境变量,则将其值用作格式。 否则,使用内置于time的默认格式。

命令time的选项必须出现在COMMAND之前的命令行中。在COMMAND之后的命令行上的任何内容都作为参数传递给COMMAND。

命令支持的选项及含义

-o FILE, –output=FILE
将资源使用统计信息写入FILE,而不是标准错误。 默认情况下,这会覆盖文件,从而破坏文件的先前内容。对于收集有关“在标准错误上生成输出程序”和“交互式程序”的信息,此选项非常有用。

-a, –append
将资源使用信息附加到输出文件而不是覆盖它。 此选项仅适用于`-o’或`–output’选项。

-f FORMAT, –format FORMAT
使用FORMAT作为控制时间输出的格式字符串。 请参阅以下更多信息。

-p, –portability
使用以下格式字符串,以符合POSIX标准1003.2:

real %e

user %U

sys %S

-v, –verbose
使用内置的详细格式,该格式在其单独的行上显示有关程序资源使用的每条可用信息,并带有其含义的英文描述。

–quiet
不要报告程序的状态,即使是非零状态。

-V, –version
显示版本信息并退出。

–help
显示帮助信息并退出。

格式化输出

格式字符串FORMAT控制time输出的内容。可以使用`-f’或`–format’为选项-v(–verbose)、-p(–portability)设置格式字符串。 如果未给出它们,但设置了TIME环境变量,则将其值用作格式字符串。 否则,使用内置的默认格式。 默认格式为:

%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k

%Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps

格式字符串通常由散布的“资源说明符”和有“纯文本”组成。格式字符串中的百分号(“%”)导致后续字符被解释为资源说明符,类似于printf(3)函数中的格式字符。

反斜杠(`\’)引入了一个“反斜杠转义”,在输出时转换为单个打印字符。\t输出制表符,\n输出换行符,\\输出反斜杠。 反斜杠后跟任何其他字符输出一个问号(“?”)后跟一个反斜杠,表示给出了无效的反斜杠转义。

格式字符串中的其他文本将逐字复制到输出中。 time在打印资源使用信息后总是打印换行符,因此通常格式字符串不会以换行符(或“\n”)结尾。

资源规格很多。并非所有资源都是由所有Unix版本测量的,因此某些值可能会报告为零。 在下表中未列出的百分号后面的任何字符都会导致输出问号(“?”),后跟该字符,以指示给出了无效的资源说明符。

以下是资源说明符:

%,字面值’%’。

C,正在计时的命令名和命令行参数。

D,进程的非共享数据区域的平均大小,以千字节为单位。

E,过程使用的实际(wall clock)时间,以[hours:]minutes:seconds为单位。

F,进程运行时,发生的主要或I/O要求、页错误的数量。这些是页实际迁移出主内存的故障。

I,进程的文件系统输入数。

K,该过程的平均总数(data+stack+text)内存使用,以千字节为单位。

M,进程在其生命周期内的最大驻留集(RSS)大小,以千字节为单位。

O,进程的文件系统输出数。

P,此作业获得的CPU百分比。这只是用户+系统时间除以总运行时间。它还会打印一个百分号。

R,次要或可恢复的页面错误数。这些页无效(因此它们有故障)但尚未被其他虚拟页面声明。因此,页面中的数据仍然有效,但必须更新系统表。

S,系统代表进程(在内核模式下)使用的CPU秒总数,以秒为单位。

U,进程直接使用的CPU秒数(在用户模式下),以秒为单位。

W,进程从主内存换出的次数。

X,进程中共享文本的平均数量,以千字节为单位。

Z,系统的页面大小,以字节为单位。这是一个每系统常量,但在不同系统之间有所不同。

c,进程被非自愿地进行上下文切换的次数(因为时间片已过期)。

e,进程使用的实际(wall clock)时间,以秒为单位。

k,传递给过程的信号数量。

p,进程的平均非共享堆栈大小,以千字节为单位。

r,进程收到的套接字消息数。

s,进程发送的套接字消息数。

t,进程的平均驻留集(RSS)大小,以千字节为单位。

w,程序自动上下文切换的次数,例如在等待I/O操作完成时。

x,退出命令的状态。

这些是tcsh(1)内建`time’命令识别的超集。

注意事项

准确性

执行程序时不会原子地收集经过的时间;因此,在奇怪的情况下(如果time命令在程序定时退出和时间计算运行时间之间停止或交换),它可能比实际执行时间大得多。

当命令的运行时间几乎为零时,某些值(例如,所使用的CPU的百分比)可以被报告为零(这是错误的)或问号。

命令time显示的大多数信息来自wait3(2)系统调用。这些数字与wait3(2)返回的数字一样好。在没有返回状态信息的wait3(2)调用的系统上,使用times(2)系统调用。但是,它提供的信息比wait3(2)少得多,因此在这些系统上,时间将大部分资源报告为零。

据称’%I’和’%O’值只是’真正的’输入和输出,不包括缓存设备提供的值。 “%I”和“%O”报告的“真实”I/O的含义可能会混淆工作站,尤其是无盘工作站。

问题诊断

当程序退出、停止、被信号终止时,命令time返回。 如果程序正常退出,则time的返回值是它执行和测量的程序的返回值。否则,返回值为128加上导致程序停止或终止的信号编号。

使用示例

要运行命令wc /etc/hosts并显示默认信息:

# time wc /etc/hosts

要运行命令ls -Fs并仅显示用户、系统、总时间:

# time -f “\t%E real,\t%U user,\t%S sys” ls -Fs

要编辑BORK文件,并让’time’将经过的时间和信号数附加到文件log,从环境变量’TIME’读取格式字符串:

# export TIME=”\t%E,\t%k” # If using bash or ksh

# setenv TIME “\t%E,\t%k” # If using csh or tcsh

# time -a -o log emacs bork

使用Bash Shell的用户需要使用绝对路径才能运行外部time命令,而不是Shell内置time指令。 在/usr/bin中安装time的系统上,上面的第一个示例应该修改为:

# /usr/bin/time wc /etc/hosts

如上示例。

相关手册

tcsh(1), printf(3)

参考文献

  • man 1 time, Version 1.7-25.1+b1

更新日志

  • 10/20/2018 创建文章