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

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

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


当前回答

下面是我用来计算Linux上在线物理内核数量的方法:

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines

简而言之:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l

示例(1个socket):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14

示例(2个socket):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28

示例(4个socket):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32

其他回答

考虑到打印可用CPU内核信息的特定示例代码片段,例如:

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

两种方法

根据最高的cpu核心id值得出总价值

利用一个事实,即CPU核心有一个连续的编号附加到它们,并存储在处理器字段下。由于proc文件中存储的每个CPU核心的信息是在一个由处理器字段升序排列的列表中,您可以简单地获取该序列的最后一个条目并观察处理器字段中的数值。

$ cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -n 1

注意:由于/proc/cpuinfo保存了一些对应于cpu计数的条目,处理器字段的初始值为0,不要忘记将最后一个cpu核心的值增加1。

$ last_cpu_core_id=$(/proc/cpuinfo | awk '/^processor/{print $3}' | tail -n 1)
$ echo $((last_cpu_core_id + 1))

计算输出的行数

这种方法与第一种方法相反,我们并不真正关心cpu核心id的特定值,我们只是计算输出行数。当涉及到计数时,这个过程通常从1开始,这简化了我们的解决方案。

使用grep

$ cat /proc/cpuinfo | grep processor | wc -l

或者,我们不需要记住处理器字段本身,而是利用描述单个cpu核心细节的每个条目由换行符分隔的事实。

cat /proc/cpuinfo | grep -v '^\w' | wc -l

使用awk

cat /proc/cpuinfo | awk '($1 == "processor") {count++ } END { print count }'

使用下面的查询获取核心细节

[oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8

如果你可以使用Python,那么numexpr模块有一个函数:

In [5]: import numexpr as ne

In [6]: ne.detect_number_of_cores()
Out[6]: 8

也:

In [7]: ne.ncores
Out[7]: 8

从命令提示符中查询该信息使用:

# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8

或者简单地说,可以从multiprocessing.cpu_count()函数中获得此信息

$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"

或者干脆使用os.cpu_count()

$ python -c "import os; print(os.cpu_count())"

如果你想这样做,让它在linux和OS X上工作,你可以这样做:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)

我还认为cat /proc/cpuinfo会给我正确的答案,但是我最近看到我的ARM四核Cortex A53系统只显示了一个单核。似乎/proc/cpuinfo只显示活动的内核,而:

猫/ sys /设备/系统/ cpu /礼物

能更好地衡量那里有什么。你也可以

cat /sys/devices/system/cpu/online

查看哪些内核在线,以及

猫姐姐/设备/系统cpu -离线

查看哪些核心处于脱机状态。在线、离线和当前sysfs条目返回cpu的索引,因此返回值为0表示核心0,而返回值为1-3表示核心1、2和3。

参见https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu