以便携式方式查找shell脚本中的处理器/ CPU数量?

ide*_*n42 3 unix shell sh

因为编写将脚本数量传递给命令的shell脚本很常见,所以我很想知道在主流*Unix系统上获得处理器数量的好方法是什么.

事情是这样,但不依赖于Python的.


*通过主流,我的意思是,它将适用于今天生产中使用的流行的Unix系统(Linux/BSD/Darwin?但是越便携越好).

ide*_*n42 8

这是一个相当便携的函数,用于获取可用的处理器数量sh:

  • 使用nprocLinux上.
  • 使用getconf作为备用,它是和的coreutils的一部分.
  • 测试工作:
    • 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
Run Code Online (Sandbox Code Playgroud)

覆盖许多系统的更简洁的命令是检查getconfglibc,然后检查sysctlBSD系列的Unix:例如:

getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu
Run Code Online (Sandbox Code Playgroud)

我稍微倾向于检查每个平台,因为它允许更容易地添加其他平台,但实际上单线在许多情况下都有效.


ste*_*nct 5

我将投入我的单线深受上面ideaman42的回答的影响:

nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null
Run Code Online (Sandbox Code Playgroud)