Programmgesteuert feststellen, ob ein Skript auf einem Laptop oder Desktop ausgeführt wird?

18

Gibt es eine zuverlässige Möglichkeit, aus einem Bash-Skript heraus (programmgesteuert) festzustellen, ob es auf einem Laptop oder einem Desktop-Computer ausgeführt wird?

Ich könnte natürlich nur den Benutzer auffordern, sie zu fragen, aber das ist ziemlich klobig.

PseudoPsyche
quelle
1
Ich würde sagen, warum Sie wissen müssen? Sorgen Sie sich um die Akkulaufzeit
Rich Homolka
3
Das Skript führt einige System-Setups für den Benutzer durch, und ein Teil davon konfiguriert einige Energiespareinstellungen, wenn das Gerät ein Laptop ist.
PseudoPsyche

Antworten:

29

Die Überprüfung, ob das System über eine Batterie verfügt, ist nicht zuverlässig. Eine an das System angeschlossene USV (nicht nur zur Stromversorgung, sondern auch zur automatischen Abschaltung und Batterieüberwachung über USB) wird möglicherweise als Batterie angezeigt.

Es gibt jedoch einen schönen zuverlässigen Weg:

dmidecode --string chassis-type

Auf einem Laptop wird entweder "Laptop", "Notebook", "Portable" oder "Sub Notebook" zurückgegeben (je nachdem, was der Hersteller im BIOS codiert hat). Eine vollständige Liste der möglichen Werte finden Sie im Windows 2000-Skripthandbuch unter " Identifizieren des Gehäusetyps eines Computers ". Machen Sie sich keine Sorgen, dass es sich um eine Microsoft TechNet-Seite handelt. Dies ist nicht betriebssystemspezifisch.

dmidecode kann auch Informationen über den Hardwarehersteller, die Seriennummer des Systems (manchmal) usw. abrufen.

Gewähren
quelle
Ich habe eine über USB gesteuerte USV zur automatischen Abschaltung und Batterieüberwachung mit dem Network UPS Tool . Es wird nicht als "Batterie" auf dem Desktop angezeigt. In welcher Konfiguration wird die USV angezeigt /sys/module/battery?
John1024
Dies funktioniert besser als die Methode / sys / module / battery: Meine beiden Ubuntu 14.04-Desktops antworten mit "Desktop" bzw. "Low Profile Desktop", und der mit CentOS 6.5 sagt "Unknown". Der mit CentOS 5.3 erkennt das Schlüsselwort "chassis-type" nicht. Auf dem Laptop, auf dem ich es ausprobiert habe, steht "Notebook". Ein Nachteil ist jedoch, dass Sie Root-Zugriff benötigen.
Thomas Padron-McCarthy
Ich mag diese Antwort wirklich!
Lembik
+1 für Distributionsunabhängigkeit. Ich habe es erfolgreich auf mehreren Maschinen getestet. Die einzige Maschine, auf der dmidecode eine weniger hilfreiche Antwort lieferte, war ein Aspire-Netbook mit einem Gehäusetyp von Other.
John1024,
Diese Antwort erfordert sudo, ist also für Dinge wie .bashrcDateien nicht realisierbar . Das Abfragen des Inhalts von /sys/class/dmi/id/chassis_type, bei dem es sich nur um eine einzelne Zahl handelt, ist viel besser (wie eine andere Antwort weiter unten zeigt).
Xdavidliu
9

Debian-Lösung:

Um herauszufinden, ob ein Computer, auf dem Debian ausgeführt wird, ein Laptop ist, versuchen Sie:

[ -d /sys/module/battery ] && echo "Yes it's a laptop"

Dieser Ansatz erfordert keine rootBerechtigungen.

Auf anderen Distributionen scheint dieses Verzeichnis jedoch zumindest in Skelettform zu existieren, unabhängig davon, ob eine Batterie vorhanden ist oder nicht. Aus den Kommentaren (unten) geht hervor, dass diese Distributionen CentOS, Ubuntu und die von Ubuntu abgeleitete Distribution von Linux Mint umfassen.

Allgemeinere Lösung

Obwohl es auf meinen Debian-Systemen nicht funktioniert, funktioniert die von Alex vorgeschlagene Lösung Berichten zufolge auf Ubuntu & CentOS. Aus Gründen der Allgemeinheit wird daher eine mögliche kombinierte Lösung vorgeschlagen:

[ -f /sys/module/battery/initstate ] || [ -d /proc/acpi/battery/BAT0 ] && echo "Yes it's a laptop"

Dieser Ansatz erfordert keine rootBerechtigungen.

Mehr Details

Auf einem Debian-System mit einer tatsächlichen Batterie /sys/module/batteryenthält das Verzeichnis viele Dateien. Eine solche Datei /sys/module/battery/initstateenthält den Text live. Unter Ubuntu existieren diese Dateien jedoch nicht einmal auf tatsächlichen Laptops. Es scheint also, dass das Vorhandensein der Datei /sys/module/battery/initstatezum Testen eines Laptops unter Debian verwendet werden kann.

Auf Debian-Systemen, die ich getestet habe, /proc/acpi/batteryexistierte das Verzeichnis dagegen nicht.

John1024
quelle
1
Ist es nicht möglich, dass der zweite Befehl bei einem Desktop mit einer USV immer noch true zurückgibt?
PseudoPsyche
3
@PseudoPsyche Ich habe es gerade auf einem Desktop mit einer USV getestet und es wurde falsch zurückgegeben (kein Laptop).
John1024,
1
Was macht der erste Befehl dort?
AndreKR
1
Anscheinend ist mein 4U IBM Server mit einem über USB angeschlossenen APC SmartUPS ein Laptop. Ich würde das Ding bestimmt nicht den ganzen Tag auf meinem Schoß haben wollen! (Wenn eine USV angeschlossen und für das Herunterfahren / Überwachen konfiguriert ist, ist dieses Verzeichnis vorhanden.)
Erteilen Sie
1
@Chipperyman Wird eine USV nicht zwischen der Wandsteckdose und einer Computersteckdose angeschlossen?“ Ja, und bei vielen USV-Konfigurationen - einschließlich Verbrauchern - können Sie ein USB-Kabel anschließen, um Informationen zur Batterie und Warnungen auf Ihrem Desktop abzurufen.
JakeGould
8

Ich würde prüfen, ob auf dem Computer ein Akku installiert ist. Und das Folgende ist eine Möglichkeit zum Testen:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Alex
quelle
Diese Methode gab auf allen fünf Computern, auf denen ich sie ausprobierte, die richtige Antwort: zwei Desktops mit Ubuntu 14.04, ein Desktop mit CentOS 5.3, ein Desktop mit CentOS 6.5 und ein Laptop mit Ubuntu 14.04. Außerdem ist kein Root-Zugriff erforderlich. Von den drei Methoden in den Antworten zeigen meine Tests, dass dies möglicherweise vorläufig die beste ist.
Thomas Padron-McCarthy
Das funktioniert bei mir.
Lembik
Dies funktionierte nicht auf den beiden von mir getesteten Debian-Laptops, sondern +1 für die Arbeit an einer Reihe anderer wichtiger Distributionen.
John1024
Funktioniert nicht bei mir (Toshiba Notebook), da mein Akku den Namen BAT1 trägt. Ich weiß nicht, wie viele andere mögliche Namen es geben könnte.
Joe
@ Joe Ändern BAT0auf BAT*- Es sollten alle Variationen erkannt werden .
Alex
8

Um die Verwendung von sudo zu vermeiden, können Sie den Inhalt von lesen /sys/class/dmi/id/chassis_type. Es scheint der folgenden Tabelle zu entsprechen:

  • 1 Sonstiges
  • 2 Unbekannt
  • 3 Desktop
  • 4 Low Profile Desktop
  • 5 Pizza Box
  • 6 Miniturm
  • 7 Turm
  • 8 Tragbar
  • 9 Laptop
  • 10 Notizbuch
  • 11 Handgehalten
  • 12 Dockingstation
  • 13 Alles in einem
  • 14 Nebennotizbuch
  • 15 Platzsparend
  • 16 Brotdose
  • 17 Hauptsystemgehäuse
  • 18 Erweiterungschassis
  • 19 SubChassis
  • 20 Buserweiterungsgehäuse
  • 21 Peripheriegerät
  • 22 Speichergehäuse
  • 23 Gestellgehäuse
  • 24 PC mit versiegeltem Gehäuse
zurückhaltend
quelle
Quelle für den Tisch? Und ist 'Lunchbox' ein Witz ?!
ABl.
1
@OJFord Ich habe derzeit kein Zitat. In Bezug auf 'lunchbox' ist dies ein Spitzname für einen Formfaktor. Ich habe schon mit ein paar Lunchboxen und Pizzaboxen gearbeitet. Auch wenn dieser Link möglicherweise nicht von langer
Dauer
1
Grants Antwort enthält ein Zitat von Microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/…
demure
Vielen Dank! Jetzt will ich einen ... Aber ich vermute, dass meine Brieftasche keinen hat.
ABl. Vom
Dies war die einzige Lösung, die für mich funktionierte, ohne sudo zu müssen. Die batteriebasierten Lösungen sagten entweder, mein Ubuntu-Desktop sei ein Laptop, oder mein Debian-Laptop sei ein Desktop.
Xdavidliu
1

Wenn die Überprüfung der Akkukapazität ausreichend ist, können Sie die folgende Shell-Funktion verwenden:

# Checks whether system is a laptop.
#
# @returns {bool}   true if system is a laptop.
function is_laptop() {
    local d
    for d in /sys/class/power_supply /proc/acpi/battery; do
        [[ -d "$d" ]] && find $d -mindepth 1 -maxdepth 1 -name 'BAT*' -print0 -quit 2>/dev/null | grep -q . && return 0
    done

    # note we're checking /sys/class/power_supply/battery/status for WSL
    for d in /sys/class/power_supply/battery/status /sys/module/battery/initstate; do
        [[ -f "$d" ]] && return 0
    done

    return 1
}

Ich benutze dies seit Jahren unter Debian. Beachten Sie, dass dies auch für Debian funktioniert, das in WSL oder virtualbox ausgeführt wird.

Bearbeiten: Von anderen Antworten in diesem Thread verallgemeinert, um mehr Fälle zu fangen.

laur
quelle