在類 unix 系統(tǒng)中,你可能知道一個命令或進(jìn)程開始執(zhí)行的時間,以及一個進(jìn)程運(yùn)行了多久。 但是,你如何知道這個命令或進(jìn)程何時結(jié)束或者它完成運(yùn)行所花費(fèi)的總時長呢? 在類 unix 系統(tǒng)中,這是非常容易的! 有一個專門為此設(shè)計(jì)的程序名叫 gnu time。 使用 time 程序,我們可以輕松地測量 linux 操作系統(tǒng)中命令或程序的總執(zhí)行時間。 time 命令在大多數(shù) linux 發(fā)行版中都有預(yù)裝,所以你不必去安裝它。
在 linux 中查找一個命令或進(jìn)程的執(zhí)行時間
要測量一個命令或程序的執(zhí)行時間,運(yùn)行:
$ /usr/bin/time -p ls
或者,
$ time ls
輸出樣例:
dir1 dir2 file1 file2 mcelog
real 0m0.007s
user 0m0.001s
sys 0m0.004s
$ time ls -a
. .bash_logout dir1 file2 mcelog .sudo_as_admin_successful
.. .bashrc dir2 .gnupg .profile .wget-hsts
.bash_history .cache file1 .local .stack
real 0m0.008s
user 0m0.001s
sys 0m0.005s
以上命令顯示出了 ls 命令的總執(zhí)行時間。 你可以將 ls 替換為任何命令或進(jìn)程,以查找總的執(zhí)行時間。
輸出詳解:
real —— 指的是命令或程序所花費(fèi)的總時間user —— 指的是在用戶模式下程序所花費(fèi)的時間sys —— 指的是在內(nèi)核模式下程序所花費(fèi)的時間我們也可以將命令限制為僅運(yùn)行一段時間。
time 與 /usr/bin/time
你可能注意到了, 我們在上面的例子中使用了兩個命令 time 和 /usr/bin/time 。 所以,你可能會想知道他們的不同。
首先, 讓我們使用 type 命令看看 time 命令到底是什么。對于那些我們不了解的 linux 命令,type 命令用于查找相關(guān)命令的信息。 更多詳細(xì)信息,請參閱本指南。
$ type -a time
time is a shell keyword
time is /usr/bin/time正如你在上面的輸出中看到的一樣,time 是兩個東西:
一個是 bash shell 中內(nèi)建的關(guān)鍵字一個是可執(zhí)行文件,如 /usr/bin/time由于 shell 關(guān)鍵字的優(yōu)先級高于可執(zhí)行文件,當(dāng)你沒有給出完整路徑只運(yùn)行 time 命令時,你運(yùn)行的是 shell 內(nèi)建的命令。 但是,當(dāng)你運(yùn)行 /usr/bin/time 時,你運(yùn)行的是真正的 gnu time 命令。 因此,為了執(zhí)行真正的命令你可能需要給出完整路徑。
在大多數(shù) shell 中如 bash、zsh、csh、ksh、tcsh 等,內(nèi)建的關(guān)鍵字 time 是可用的。 time 關(guān)鍵字的選項(xiàng)少于該可執(zhí)行文件,你可以使用的唯一選項(xiàng)是 -p。
你現(xiàn)在知道了如何使用 time 命令查找給定命令或進(jìn)程的總執(zhí)行時間。 想進(jìn)一步了解 gnu time 工具嗎? 繼續(xù)閱讀吧!
關(guān)于 gnu time 程序的簡要介紹
gnu time 程序運(yùn)行帶有給定參數(shù)的命令或程序,并在命令完成后將系統(tǒng)資源使用情況匯總到標(biāo)準(zhǔn)輸出。 與 time 關(guān)鍵字不同,gnu time 程序不僅顯示命令或進(jìn)程的執(zhí)行時間,還顯示內(nèi)存、i/o 和 ipc 調(diào)用等其他資源。
time 命令的語法是:
/usr/bin/time [options] command [arguments...]上述語法中的 options 是指一組可以與 time 命令一起使用去執(zhí)行特定功能的選項(xiàng)。 下面給出了可用的選項(xiàng):
-f, –format —— 使用此選項(xiàng)可以根據(jù)需求指定輸出格式。-p, –portability —— 使用簡要的輸出格式。-o file, –output=file —— 將輸出寫到指定文件中而不是到標(biāo)準(zhǔn)輸出。-a, –append —— 將輸出追加到文件中而不是覆蓋它。-v, –verbose —— 此選項(xiàng)顯示 time 命令輸出的詳細(xì)信息。–quiet – 此選項(xiàng)可以防止 time 命令報告程序的狀態(tài).當(dāng)不帶任何選項(xiàng)使用 gnu time 命令時,你將看到以下輸出。
$ /usr/bin/time wc /etc/hosts
9 28 273 /etc/hosts
0.00user 0.00system 0:00.00elapsed 66%cpu (0avgtext+0avgdata 2024maxresident)k
0inputs+0outputs (0major+73minor)pagefaults 0swaps如果你用 shell 關(guān)鍵字 time 運(yùn)行相同的命令, 輸出會有一點(diǎn)兒不同:
$ time wc /etc/hosts
9 28 273 /etc/hosts
real 0m0.006s
user 0m0.001s
sys 0m0.004s有時,你可能希望將系統(tǒng)資源使用情況輸出到文件中而不是終端上。 為此, 你可以使用 -o 選項(xiàng),如下所示。
$ /usr/bin/time -o file.txt ls
dir1 dir2 file1 file2 file.txt mcelog正如你看到的,time 命令不會顯示到終端上。因?yàn)槲覀儗⑤敵鰧懙搅薴ile.txt 的文件中。 讓我們看一下這個文件的內(nèi)容:
$ cat file.txt
0.00user 0.00system 0:00.00elapsed 66%cpu (0avgtext+0avgdata 2512maxresident)k
0inputs+0outputs (0major+106minor)pagefaults 0swaps當(dāng)你使用 -o 選項(xiàng)時, 如果你沒有一個名為 file.txt 的文件,它會創(chuàng)建一個并把輸出寫進(jìn)去。如果文件存在,它會覆蓋文件原來的內(nèi)容。
你可以使用 -a 選項(xiàng)將輸出追加到文件后面,而不是覆蓋它的內(nèi)容。
$ /usr/bin/time -a file.txt ls
-f 選項(xiàng)允許用戶根據(jù)自己的喜好控制輸出格式。 比如說,以下命令的輸出僅顯示用戶,系統(tǒng)和總時間。
$ /usr/bin/time -f \t%e real,\t%u user,\t%s sys ls
dir1 dir2 file1 file2 mcelog
0:00.00 real, 0.00 user, 0.00 sys請注意 shell 中內(nèi)建的 time 命令并不具有 gnu time 程序的所有功能。
有關(guān) gnu time 程序的詳細(xì)說明可以使用 man 命令來查看。
$ man time
想要了解有關(guān) bash 內(nèi)建 time 關(guān)鍵字的更多信息,請運(yùn)行:
$ help time