由于编写shell脚本将作业数传递给命令是很常见的,我很想知道在主流 * Unix系统上获取处理器数的一种好的、可移植的方法是什么。like this,但不依赖Python。
qxgroojn1#
下面是一个相当可移植的函数,用于获取sh、bash和兼容shell中工作的处理器数量:
sh
bash
nproc
getconf
Linux
Darwin
FreeBSD
NetBSD
OpenBSD
请随意添加:
#!/bin/sh portable_nproc() { OS="$(uname -s)" if [ "$OS" = "Linux" ]; then NPROCS="$(nproc --all)" elif [ "$OS" = "Darwin" ] || \ [ "$(echo "$OS" | grep -q BSD)" = "BSD" ]; then NPROCS="$(sysctl -n hw.ncpu)" else NPROCS="$(getconf _NPROCESSORS_ONLN)" # glibc/coreutils fallback fi echo "$NPROCS" } # test portable_nproc
一个更简洁的命令,涵盖了许多系统,是检查getconf的glibc,然后检查sysctl的BSD系列Unix:例如:
sysctl
getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu
我对检查每个平台有一点偏好,因为它允许其他平台更容易地添加,但在实践中,单行在许多情况下都是有效的。
js4nwp542#
我将抛出我的一句话,这句话深受ideasman42上面的答案的影响:
nproc 2>/dev/null || sysctl -n hw.logicalcpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null
kxxlusnw3#
使用nproc,它是coreutils的一部分,所以它应该在大多数Linux安装中可用。命令nproc打印当前进程可用的处理单元数,该数量可能小于联机处理器的数量。使用nproc --all查找所有已安装的内核/处理器的数量
$ nproc --all 4
或者更易移植的将是sysctl和/proc/cpuinfo组合sysctl应该在达尔文/BSD上工作
grep -c '^processor' /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu
3条答案
按热度按时间qxgroojn1#
下面是一个相当可移植的函数,用于获取
sh
、bash
和兼容shell中工作的处理器数量:nproc
。getconf
作为后备,它是coreutils的一部分。Linux
Darwin
(macOS)FreeBSD
、NetBSD
、OpenBSD
请随意添加:
一个更简洁的命令,涵盖了许多系统,是检查
getconf
的glibc,然后检查sysctl
的BSD系列Unix:例如:我对检查每个平台有一点偏好,因为它允许其他平台更容易地添加,但在实践中,单行在许多情况下都是有效的。
js4nwp542#
我将抛出我的一句话,这句话深受ideasman42上面的答案的影响:
kxxlusnw3#
使用nproc,它是coreutils的一部分,所以它应该在大多数Linux安装中可用。
命令nproc打印当前进程可用的处理单元数,该数量可能小于联机处理器的数量。
使用nproc --all查找所有已安装的内核/处理器的数量
或者更易移植的将是sysctl和/proc/cpuinfo组合
sysctl应该在达尔文/BSD上工作