在shell脚本中找到处理器/CPU数量的便携式方法?

kmbjn2e3  于 2023-05-18  发布在  Shell
关注(0)|答案(3)|浏览(196)

由于编写shell脚本将作业数传递给命令是很常见的,我很想知道在主流 * Unix系统上获取处理器数的一种好的、可移植的方法是什么。
like this,但不依赖Python。

    • 主流,我的意思是,它将在今天生产中使用的流行Unix系统上工作(Linux/BSD的/达尔文?但越便携越好)。
qxgroojn

qxgroojn1#

下面是一个相当可移植的函数,用于获取shbash和兼容shell中工作的处理器数量:

  • 在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

我对检查每个平台有一点偏好,因为它允许其他平台更容易地添加,但在实践中,单行在许多情况下都是有效的。

js4nwp54

js4nwp542#

我将抛出我的一句话,这句话深受ideasman42上面的答案的影响:

nproc 2>/dev/null || sysctl -n hw.logicalcpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null
kxxlusnw

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

相关问题