在 Linux 系統中,設定 crontab 可以讓程式在某個時間點重跑。但要怎麼確定它真的在設定的時間重跑呢?
二個方法,我們先看困難的,再再看怎麼快速取得。
困難的方法:從系統資訊裡找答案
在
/proc/[行程代碼]/stat 裡,有一些行程的相關資料。查一下
stat 的欄位文件,第 22 欄
starttime 就是程式執行的時間點。但是
- 它要除以時鐘周期 (clock ticks) sysconf(_SC_CLK_TCK) 的數值。
- 它的單位是 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 完全相同。
參考資料