Un moyen portable de trouver le nombre de processeurs / CPU dans un script shell?

Comme il est courant d’écrire des scripts shell qui transmettent le nombre de travaux à une commande, je suis curieux de savoir ce qu’est un bon moyen portable pour obtenir le nombre de processeurs sur les systèmes Unix traditionnels.

Quelque chose comme ça mais ne dépendant pas de Python.


* Par grand public, je veux dire que cela fonctionnera sur le système Unix populaire utilisé en production aujourd’hui (Linux / BSD / Darwin? Mais le plus portable sera le mieux).

Voici une fonction assez portable pour obtenir le nombre de processeurs fonctionnant dans sh :

  • Utilise nproc sous Linux.
  • Utilisez getconf comme getconf de repli, cela fait partie de coreutils.
  • Testé pour travailler sur:
    • Linux
    • Darwin (MacOS)
    • FreeBSD , NetBSD , OpenBSD

… probablement d’autres, n’hésitez pas à tester 🙂

N’hésitez pas à suggérer des ajouts:

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

Une commande plus concise qui couvre de nombreux systèmes consiste à vérifier getconf pour la glibc, puis sysctl pour la famille BSD d’Unix: par exemple:

 getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu 

J’ai une légère préférence pour la vérification de chaque plate-forme car cela permet d’append plus facilement d’autres, mais dans la pratique, la simple ligne fonctionne dans de nombreux cas.

Utilisez nproc qui fait partie de coreutils, il devrait donc être disponible sur la plupart des installations Linux.

La commande nproc imprime le nombre d’unités de traitement disponibles pour le processus en cours, qui peut être inférieur au nombre de processeurs en ligne.

Pour trouver le nombre de cœurs / processeurs installés, utilisez nproc –all

 $ nproc --all 4 

ou un plus portable sera sysctl avec / proc / cpuinfo combiné

sysctl devrait fonctionner sur darwin / BSD

 grep -c '^processor' /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu