由于编写将脚本数量传递给命令的shell脚本很常见,我有兴趣知道什么是一种好的,可移植的方式来获得主流* Unix系统上的处理器数量
某事like this但不依赖于Python。
* 通过主流,我的意思是,它将适用于今天生产中使用的流行的Unix系统(Linux / BSD&s / Darwin?但是便携性越好)。
答案 0 :(得分:7)
这是一个相当便携式函数,用于获取sh
中工作的处理器数量:
nproc
。getconf
作为后备,它是coreutils的一部分。Linux
Darwin
(macOS)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:例如:
getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu
我稍微倾向于检查每个平台,因为它允许更容易地添加其他平台,但实际上单线在许多情况下都有效。
答案 1 :(得分:2)
使用属于coreutils的nproc,因此它应该可以在大多数Linux安装中使用。
命令nproc打印当前进程可用的处理单元数,可能少于在线处理器数。
要查找所有已安装的核心/处理器的数量,请使用nproc --all
$ nproc --all
4
或者更便携的将是/ proc / cpuinfo组合的sysctl
sysctl应该适用于darwin / BSD
grep -c '^processor' /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu
答案 2 :(得分:1)
在上面ideasman42的回答的影响下,我将投入一线工作:
nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null