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

时间:2017-07-19 04:40:15

标签: shell unix sh

由于编写将脚本数量传递给命令的shell脚本很常见,我有兴趣知道什么是一种好的,可移植的方式来获得主流* Unix系统上的处理器数量

某事like this但不依赖于Python。

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

3 个答案:

答案 0 :(得分:7)

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

  • 在Linux上使用nproc
  • 使用getconf作为后备,它是coreutils的一部分。
  • 经过测试可用于:
    • Linux
    • Darwin(macOS)
    • FreeBSDNetBSDOpenBSD

...可能是其他人,请随时测试:)

随意建议添加:

#!/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