取得行程起始時間

取得行程起始時間

更新於 發佈於 閱讀時間約 3 分鐘

在 Linux 系統中,設定 crontab 可以讓程式在某個時間點重跑。但要怎麼確定它真的在設定的時間重跑呢?

二個方法,我們先看困難的,再再看怎麼快速取得。

困難的方法:從系統資訊裡找答案

/proc/[行程代碼]/stat 裡,有一些行程的相關資料。查一下 stat 的欄位文件,第 22 欄 starttime 就是程式執行的時間點。但是

  1. 它要除以時鐘周期 (clock ticks) sysconf(_SC_CLK_TCK) 的數值。
  2. 它的單位是 jiffies,不是 timestamp。也就是它是算自作業系統跑起來後,第幾個時鐘周期開始跑這支程式,這樣是很精確的時間點,但這表示我們要多花些工夫來轉換成現實時間。

所以我們要先查下系統的 _SC_CLK_TCK 是多少,在終端機中用 getconf 指令就可以確定。

getconf CLK_TCK

查出來數值是 100。用 cat /proc/[行程代碼]/stat 然後算一算第 22 欄的數字再除 100 也可以,但我們可以用較好的方式,例如用 awk 來剖析就不用拿筆對準螢幕一個個算到 22 欄。

awk '{print int($22 / 100)}' /proc/[行程代碼]/stat

該行的意思,是將 /proc/[行程代碼]/stat 的第 22 欄除 100 取整數。於是可以取得 starttime 的數據了,結果時間單位是秒。

接著,我們要確定作業系統跑了多久。這看 /proc/uptime 第一欄就行,單位是秒。

awk '{print int($1)}' /proc/uptime

就是無聊,不想再用 awk 指令,那用 cut 來切吧。要注意的是要取整數,於是用小數點當成分割標記。

cat /proc/uptime | cut -d '.' -f 1

然後要計算,公式如下:

現在時間 - (開機時間 - 程式執行時間)

現在時間的 timestamp 可以用 date 指令取得

date +%s

之後將上面的三個數字加加減減,就可以取得執行時的 timestamp,再用 date 將它轉成可讀時間

date -d timestamp

我們將這些寫成 shell script


用這方式就可以取得程式執行時間

./pidstarttime.sh 5566


簡單的方法:用指令取得答案

終端機用 ps 指令,加上 lstart 參數,就可以直接取得資料,不用管它是什麼 jiffies 除時脈變成秒。

ps -o lstart= -p [行程代碼]

補充:macOS 因為它沒有 /proc 的機制,所以只能用這個 ps 指令來做,這指令參數跟 Linux 完全相同。



參考資料

avatar-img
WILSON PENG的沙龍
2會員
26內容數
留言
avatar-img
留言分享你的想法!
WILSON PENG的沙龍 的其他內容
UTF-8 萬國碼在規格定義時,有建議在文件的開始處,加入位元組順序記號 (BOM, byte-order mark)。但 Plain Text 文件,就是全部都是文字,將它加入檔頭標記,就不是純文字檔案了,所以一般都沒有實作成有 BOM 檔頭的檔案。
要怎麼判斷是奇數還是偶數? 除以 2 有餘數的是奇數,無餘數的是偶數。 有沒有更快的方法?
當使用 Wordpress 架站時,系統至少會有四層漏洞:
UTF-8 萬國碼在規格定義時,有建議在文件的開始處,加入位元組順序記號 (BOM, byte-order mark)。但 Plain Text 文件,就是全部都是文字,將它加入檔頭標記,就不是純文字檔案了,所以一般都沒有實作成有 BOM 檔頭的檔案。
要怎麼判斷是奇數還是偶數? 除以 2 有餘數的是奇數,無餘數的是偶數。 有沒有更快的方法?
當使用 Wordpress 架站時,系統至少會有四層漏洞: