Scripting
查找給定節點中可用的核心數
我需要修復以下程式碼。該程式碼旨在確定給定節點中可用的核心數量。
第 1 步:獲取核心數
TC=$(grep -c process /proc/cpuinfo)
第 2 步:忽略小數的正常執行時間
LA=$(uptime | cut -d ' ' -f 13 | head -c 1)
第 3 步:減去
$LA
以$TC
獲得我可以執行的程序數procs=$(expr $TC - $LA)
我的問題在於第 2 步:當我輸入 時
uptime | cut -d ' ' -f 13 | head -c 1
,我得到a
. 這意味著什麼?第2步有錯誤嗎?讓我補充一點,如果我簡單地輸入,
uptime
我會得到23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00
的輸出
uptime
包括幾個帶有可變數量空格的欄位。cut
將每個空格視為欄位分隔符,因此對其中一些值的更改將意味著您cut
完全提取了一個不同的數字。例如,使用者數是用空格填充的。小於 10 時,有兩個空格;當10個或更多時,只有1個。
$ echo ' 23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00'|cut -d ' ' -f13 average: $ echo ' 23:17:01 up 38 days, 38 min, 10 users, load average: 0.00, 0.00, 0.00'|cut -d ' ' -f13 0.00,
您可以改為使用
awk
,它允許每個欄位之間有可變數量的空間(並忽略行首的空間):$ echo ' 23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00' | awk '{print $11}'
但是,如果“單詞”本身的數量發生變化,這仍然會中斷,例如。當正常執行時間本身不是(僅)幾天和幾分鐘時:
14:51:24 up 4 min, 1 user, load average: 0.17, 0.16, 0.07 14:52:09 up 6 days, 21:58, 11 users, load average: 0.79, 0.84, 0.82
所以行上的其他標點符號,逗號和冒號,也可以改變,對於找到你需要的數字沒有幫助。
您可以使用它
grep -o ...
來僅提取單詞load average:
,並從中提取正確的單詞。但是,如果您的作業系統有這樣的文件,那麼uptime
完全停止解析 的輸出,而是從中提取平均負載會簡單得多:/proc/loadavg
$ cat /proc/loadavg 1.01 0.91 0.85 1/793 24545
如果你只想要第一個數字,忽略小數,你可以用一個
cut
:$ cut -d. -f1 /proc/loadavg 1