Process

如何檢查一個程序已經執行了多長時間?

  • January 24, 2022

我想通過從監控應用程序啟動程序來避免這樣做。

ps在帶有from的 Linux 上procps(-ng)(以及大多數其他系統,因為這是由 POSIX 指定的):

ps -o etime= -p "$$" 

$$您要檢查的程序的PID在哪裡。這將以格式返回經過的時間[[dd-]hh:]mm:ss

使用-o etime告訴ps您只需要​​經過時間欄位,並且=在結尾處抑制標題(沒有,您會得到一行,ELAPSED然後是下一行的時間;使用,您只會得到一行與時間) .

或者,在 Linux 或 FreeBSD 9.0 或更高版本(可能還有其他版本)上使用更新版本的 procps-ng 工具套件(3.3.0 或更高版本),使用:

ps -o etimes= -p "$$"

(添加s)以將時間格式化為秒,這在腳本中更有用。

在 Linux 上,ps程序從 獲取此資訊/proc/$$/stat,其中一個欄位(請參閱man proc)是程序開始時間。不幸的是,這被指定為自系統啟動以來的 jiffies 時間(Linux 核心中使用的任意時間計數器)。因此,您必須確定係統啟動的時間(從 開始/proc/stat),該系統上每秒的 jiffies 數,然後進行數學運算以獲得有用格式的經過時間。

事實證明,要找到 HZ 的值(即每秒 jiffies)非常複雜。根據sysinfo.cprocps 包中的註釋,可以 A) 包含核心標頭檔並在使用不同核心時重新編譯,B) 使用 posixsysconf()函式,遺憾的是,該函式使用編譯到 C 庫中的硬編碼值,或者C)詢問核心,但沒有官方介面可以這樣做。因此,ps程式碼包含一系列用於確定正確值的組合。哇。

因此,ps為您完成這一切很方便。:)

正如使用者 @336_ 所指出的,在 Linux(這不是可移植的)上,您可以使用該stat命令查看目錄的訪問、修改或狀態更改日期/proc/$$(這$$也是感興趣的過程)。所有三個數字應該相同,所以

stat -c%X /proc/$$

將為您提供該過程$$開始的時間,以紀元以來的秒數為單位。這仍然不是您想要的,因為您仍然需要進行數學運算以從目前時間中減去它以獲得經過的時間 - 我想類似date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"的東西會起作用,但它有點笨拙。一個可能的優勢是,如果您使用長格式輸出-c%x而不是-c%X,您將獲得比整數秒更高的解析度。但是,如果您需要,您可能應該使用流程審計方法,因為執行 stat 命令的時間會影響準確性。

引用自:https://unix.stackexchange.com/questions/7870