查找给定节点中可用的核心数

查找给定节点中可用的核心数

我需要修复以下代码。该代码旨在确定给定节点中可用的核心数量。

步骤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

答案1

的输出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

答案2

您的剪切命令正在剪切第 13 个字段,但您想要第 14 个字段......

⇨  uptime |cut -d ' ' -f 13
average:

在执行完您的剪切命令之后,您将看到“a”字符。

尝试:

⇨  uptime |cut -d ' ' -f 14
0.18

另请注意,您的 head -c 1 会截掉小数...我认为您最好四舍五入或其他方式。也许看看BC。

相关内容