網站搜尋

在 Linux 中查找命令或進程的執行時間


你可能已經知道在 Linux 和類 Unix 系統中,一個命令或過程的開始時間以及該過程運行了多久。但是,你怎麼知道命令或過程什麼時候結束呢?我的意思是——你如何知道命令或過程完成所花的總時間?嗯,這很簡單!在類 Unix 系統中,有一個名為'GNU time'的工具專門為這個目的而設計。使用 Time 工具,我們可以輕鬆地測量命令或程序在 Linux 操作系統中的總執行時間。好消息是,大多數 Linux 發行版中預裝了 'time' 命令,所以你不需要費心安裝。

在 Linux 中查找命令或進程的執行時間

要測量命令/程式的執行時間,只需運行它。

$ /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' 指令的總執行時間。將 "ls" 替換為您選擇的任何指令/程序,以查找總執行時間。

這裡

  1. real - 指命令/程式所花費的總時間,
  2. user - 指程序在使用者模式下所花費的時間,
  3. sys - 指程序在核心模式下所花費的時間。

我們也可以限制指令僅在特定時間內運行。更多細節請參考以下指南。

  • 如何在 Linux 中為指定時間運行命令

time 與 /usr/bin/time

如你所注意到的,我們在上述範例中使用了兩個指令 'time' 和 '/usr/bin/time'。所以,你可能會想知道它們之間的差別是什麼。

首先,讓我們使用 type 命令來看看實際上 'time' 是什麼。對於那些不知道的人,type 命令用來查詢 Linux 命令的相關資訊。更多詳細資訊,請參考 這個指南。

$ type -a time
time is a shell keyword
time is /usr/bin/time

如你在上述輸出中所見,時間是兩者,

  • 內建於 BASH shell 的關鍵字
  • 一個可執行檔,即 /usr/bin/time

由於 shell 關鍵字優先於可執行檔,因此當你僅運行 time 命令而不提供完整路徑時,你運行的是內建 shell 命令。但是,當你運行 /usr/bin/time 時,你運行的是真正的 GNU time 程式。因此,為了使用真正的命令,你可能需要指定它的明確路徑。清楚了嗎?好!

內建的 'time' shell 關鍵字在大多數 shell 中可用,如 BASH、ZSH、CSH、KSH、TCSH 等。'time' shell 關鍵字的選項比可執行檔少。在 'time' 關鍵字中你唯一可以使用的選項是 -p。

你現在已經知道如何使用 'time' 命令來查找給定命令/進程的總執行時間。想了解更多關於 'GNU time' 工具的資訊嗎?繼續閱讀吧!

關於『GNU time』程式的簡要說明

GNU time 程式會使用給定的參數執行一個命令/程式,並在命令完成後將系統資源使用情況總結為標準輸出。與 'time' 關鍵字不同,GNU time 程式不僅顯示命令/進程使用的時間,還包括其他資源如記憶體、I/O 和 IPC 調用。

Time 指令的典型語法是:

/usr/bin/time [options] command [arguments...]

上述語法中的「options」指的是可以與 time 命令一起使用以執行特定功能的一組標誌。可用的選項列表如下。

  • -f, --format - 使用此選項來指定您希望的輸出格式。
  • -p, --portability - 使用可攜式輸出格式。
  • -o 檔案, --output=FILE - 將輸出寫入 FILE 而不是顯示為標準輸出。
  • -a, --append - 將輸出附加到 FILE,而不是覆蓋它。
  • -v,--verbose - 此選項會顯示'time' 工具輸出的詳細說明。
  • --quiet - 此選項可防止 time 工具報告程式的狀態。

當使用「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 內建關鍵字 'time' 執行相同的命令,輸出會有些不同:

$ time wc /etc/hosts
9 28 273 /etc/hosts

real 0m0.006s
user 0m0.001s
sys 0m0.004s

有時候,你可能想將系統資源使用情況的輸出寫入檔案,而不是顯示在終端機上。要做到這一點,可以像下面這樣使用 -o 標誌。

$ /usr/bin/time -o file.txt ls
dir1 dir2 file1 file2 file.txt mcelog

如您在輸出中所見,Time 工具並未顯示輸出。因為,我們將輸出寫入一個名為 file.txt 的文件中。讓我們來看看這個文件:

$ cat file.txt 
0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 2512maxresident)k
0inputs+0outputs (0major+106minor)pagefaults 0swaps

當你使用 -o 參數時,如果沒有名為 'file.txt' 的檔案,它將會創建並將輸出寫入其中。如果 file.txt 已經存在,它將會覆蓋其內容。

你也可以使用 -a 標誌將輸出附加到檔案,而不是覆蓋它。

$ /usr/bin/time -a file.txt ls

-f 標誌允許使用者按照他/她的喜好控制輸出的格式。例如,以下命令顯示了 ls 命令的輸出,並僅顯示使用者時間、系統時間和總時間。

$ /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 指令 'time' 並不支援 GNU time 程式的所有功能。

有關 GNU time 工具的更多詳細資訊,請參閱手冊頁。

$ man time

要了解更多關於 Bash 內建的 'Time' 關鍵字,請執行:

$ help time

資源:

  • Nixcraft
  • AskUbuntu