Scripting

查找給定節點中可用的核心數

  • December 12, 2018

我需要修復以下程式碼。該程式碼旨在確定給定節點中可用的核心數量。

第 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

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