Ich habe dieses Skript, aber ich weiß nicht, wie ich das letzte Element im Ausdruck erhalten kann:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
Das letzte Element sollte die Anzahl der CPUs minus 1 sein.
Ich habe dieses Skript, aber ich weiß nicht, wie ich das letzte Element im Ausdruck erhalten kann:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
Das letzte Element sollte die Anzahl der CPUs minus 1 sein.
Verarbeitung des Inhalts von /proc/cpuinfo
ist unnötig barock. Verwenden Sie nproc das Teil der coreutils ist, sollte also auf den meisten Linux-Installationen verfügbar sein.
Befehl nproc
gibt die Anzahl der für den aktuellen Prozess verfügbaren Verarbeitungseinheiten aus, die geringer sein kann als die Anzahl der Online-Prozessoren.
Um die Anzahl aller installierten Kerne/Prozessoren zu ermitteln, verwenden Sie nproc --all
Auf meinem 8-Kern-Rechner:
$ nproc --all
8
grep -c ^processor /proc/cpuinfo
zählt die Anzahl der Zeilen, die mit "processor" in /proc/cpuinfo
Für Systeme mit Hyper-Threading können Sie
grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}'
die (zum Beispiel) Folgendes zurückgeben sollte 8
(wohingegen der obige Befehl Folgendes zurückgeben würde 16
)
Die tragbarste Lösung, die ich gefunden habe, ist die getconf
Befehl:
getconf _NPROCESSORS_ONLN
Dies funktioniert sowohl unter Linux als auch unter Mac OS X. Ein weiterer Vorteil gegenüber anderen Ansätzen ist, dass es getconf schon seit langem gibt. Einige der älteren Linux-Maschinen, auf denen ich entwickeln muss, haben nicht die nproc
o lscpu
Befehle zur Verfügung, aber sie haben getconf
.
Anmerkung der Redaktion: Während die getconf
Dienstprogramm ist POSIX-mandatiert die spezifische _NPROCESSORS_ONLN
y _NPROCESSORS_CONF
Werte sind es nicht. Wie bereits erwähnt, funktionieren sie sowohl auf Linux-Plattformen als auch auf macOS; auf FreeBSD/PC-BSD müssen Sie das führende _
.
Vorwort:
En Problem mit dem /proc/cpuinfo
-basierte Antworten ist, dass sie Informationen auswerten, die eigentlich für menschlich Verbrauch und damit kein stabiles Format für maschinelles Parsing : Das Ausgabeformat kann sich je nach Plattform und Laufzeitbedingungen unterscheiden; mit lscpu -p
unter Linux (und sysctl
unter macOS) umgeht dieses Problem .
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
unterscheidet nicht zwischen logisch y physisch CPUs.
Hier ist ein sh
(POSIX-kompatibles) Snippet, das unter folgenden Bedingungen funktioniert Linux und macOS zur Bestimmung der Anzahl der - online - logisch o physisch CPUs ; siehe die Kommentare für Details.
Verwendet lscpu
für Linux, und sysctl
für macOS.
Anmerkung zur Terminologie : CPU bezieht sich auf die kleinste Verarbeitungseinheit, wie sie vom Betriebssystem gesehen wird. Nicht-Hyperthreading-Kerne entsprechen jeweils einer CPU, während Hyperthreading-Kerne mehr als eine (typischerweise 2) - logische - CPU enthalten.
Linux verwendet die folgende Taxonomie [1] , beginnend mit der kleinsten Einheit:
CPU < Kernstück < Steckdose < Buch < Knoten
wobei jede Ebene 1 oder mehrere Instanzen der nächst niedrigeren Ebene umfasst.
#!/bin/sh
# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of
# interest directly.
# CAVEAT: Using the "_max" key suffixes means that the *maximum*
# available number of CPUs is reported, whereas the
# current power-management mode could make *fewer* CPUs
# available; dropping the "_max" suffix would report the
# number of *currently* available ones; see [1] below.
#
# Linux: Parse output from `lscpu -p`, where each output line represents
# a distinct (logical) CPU.
# Note: Newer versions of `lscpu` support more flexible output
# formats, but we stick with the parseable legacy format
# generated by `-p` to support older distros, too.
# `-p` reports *online* CPUs only - i.e., on hot-pluggable
# systems, currently disabled (offline) CPUs are NOT
# reported.
# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
# Linux: Simply count the number of (non-comment) output lines from `lscpu -p`,
# which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.logicalcpu_max ||
lscpu -p | egrep -v '^#' | wc -l)
# Number of PHYSICAL CPUs (cores).
# Linux: The 2nd column contains the core ID, with each core ID having 1 or
# - in the case of hyperthreading - more logical CPUs.
# Counting the *unique* cores across lines tells us the
# number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] &&
sysctl -n hw.physicalcpu_max ||
lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)
# Print the values.
cat <<EOF
# of logical CPUs: $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF
[1] macOS sysctl (3)
Dokumentation
Beachten Sie, dass andere von BSD abgeleitete Systeme als macOS - z. B. FreeBSD - nur die Option hw.ncpu
Schlüssel für sysctl
die unter macOS veraltet sind; ich bin mir nicht sicher, welche der neuen Tasten hw.npu
entspricht: hw.(logical|physical)cpu_[max]
.
Hut ab vor @teambob für seine Hilfe bei der Korrektur der physikalischen CPU-Zahl lscpu
Befehl.
Caveat : lscpu -p
Die Ausgabe enthält KEINE Spalte "Buch" (die man
Seite erwähnt "Bücher" als eine Entität zwischen Sockel und Knoten in der taxonomischen Hierarchie). Wenn "books" auf einem bestimmten Linux-System im Spiel sind ( Weiß jemand, wann und wie? ), kann der Befehl physical-CPU-count unter -Bericht (dies basiert auf der Annahme, dass lscpu
meldet IDs, die nicht eindeutig sind zwischen übergeordneten Einheiten z.B.: 2 verschiedene Kerne von 2 verschiedenen Sockeln können die gleiche ID haben).
Wenn Sie den obigen Code z. B. als Shell-Skript speichern cpus
, machen Sie es ausführbar mit chmod +x cpus
und legen Sie sie in einem Ordner in Ihrem $PATH
erhalten Sie eine Ausgabe wie die folgende:
$ cpus
logical 4
physical 4
[1] Xaekai erhellt, was ein Buch ist: "a Buch ist ein Modul, das eine Leiterplatte mit CPU-Sockeln, RAM-Sockeln, IO-Anschlüssen am Rand und einem Haken für die Integration des Kühlsystems enthält. Sie werden in IBM-Mainframes verwendet. Weitere Informationen: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
lscpu
sammelt Informationen zur CPU-Architektur aus /proc/cpuinfon in einem für Menschen lesbaren Format:
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 4
CPU socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 15
Stepping: 7
CPU MHz: 1866.669
BogoMIPS: 3732.83
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
NUMA node0 CPU(s): 0-7
Siehe auch https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
15 Stimmen
Das müssen Sie nicht
cat
antes deawk
trotzdem: einfachawk '<script>' /proc/cpuinfo
und so weiter:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. Und du kommst ohne "minus eins" rein.2 Stimmen
Um die Frage direkt zu beantworten, leiten Sie das nach
tail -n 1
der die letzte Zeile übernimmt und ausgibt.1 Stimmen
Siehe auch unix.stackexchange.com/q/564494/5132 .