我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

最后一个元素应该是cpu数量减1。


当前回答

上述答案适用于大多数情况,但如果您处于docker容器环境中,并且容器受到CpusetCpus的限制,那么您实际上无法通过上述方法获得真正的cpu内核。

在这种情况下,你需要这样做来获得真正的cpu内核:

grep -c 'cpu[0-9]' /proc/stat

其他回答

不是我的网页,但是来自http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902的这个命令在centos上很适合我。即使启用了超线程,它也会显示实际的cpu。

Cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l

下面将给出超线程和非超线程系统上的“真实”内核数。至少它在我所有的测试中都有效。

awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 };  END { print CORES*P }' /proc/cpuinfo
 dmidecode  | grep -i cpu | grep Version

给我

版本:Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz 版本:Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz

这是正确的插座数量-查找E5-2667告诉我每个插座有8个核心,所以乘以,最终在2个插座上有16个核心。

lscpu给了我20个cpu -这是完全不正确的-不知道为什么。(cat /proc/cpu也一样-结果是20。

cat /proc/cpuinfo | grep processor

这工作得很好。当我尝试第一个答案时,我得到了3个CPU的输出。我知道我在系统上有4个cpu,所以我只是为处理器做了一个grep,输出看起来像这样:

[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

使用getconf确实是最可移植的方式,但是变量在BSD和Linux中与getconf有不同的名称,所以你必须测试这两个,正如要点所示: https://gist.github.com/jj1bdx/5746298 (还包括使用ksh的Solaris修复)

我个人使用:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1

如果你想在python中使用这个,你可以通过导入os模块来使用getconf使用的syscall:

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'

至于nproc,它是GNU Coreutils的一部分,所以默认情况下在BSD中不可用。它在其他一些方法之后也使用sysconf()。