Determinare programmaticamente se uno script viene eseguito su laptop o desktop?


18

Esiste un modo affidabile per determinare (programmaticamente) dall'interno di uno script bash se viene eseguito su un laptop o un computer desktop?

Ovviamente potrei semplicemente chiedere all'utente di chiedere loro, ma è piuttosto goffo.


1
Direi perché devi saperlo? Sei preoccupato per la durata della batteria
Rich Homolka,

3
Lo script sta eseguendo alcune impostazioni di sistema per l'utente e parte di ciò sta configurando alcune impostazioni di risparmio energetico se il dispositivo è un laptop.
PseudoPsyche,

Risposte:


29

Controllare se il sistema ha una batteria non è affidabile: un UPS collegato al sistema (non solo per l'alimentazione, ma tramite USB anche per l'arresto automatico e il monitoraggio della batteria) può apparire come una batteria.

Esiste comunque un modo affidabile e affidabile:

dmidecode --string chassis-type

Su un laptop, questo restituirà uno di "Laptop", "Notebook" "Portable" o "Sub Notebook" (a seconda di ciò che il produttore ha codificato nel BIOS). C'è un elenco completo di possibili valori in " Identificazione del tipo di telaio di un computer " nella Guida agli script di Windows 2000. Non preoccuparti che si tratti di una pagina Microsoft TechNet, questo non è specifico del sistema operativo.

dmidecode può anche ottenere informazioni sul produttore dell'hardware, il numero di serie del sistema (a volte), ecc.


Ho un UPS controllato tramite USB per lo spegnimento automatico e il monitoraggio della batteria con Network UPS Tool . E 'non non apparire come una "batteria" sul desktop. In quale configurazione stai utilizzando quello in cui appare un UPS /sys/module/battery?
Giovanni 1024,

Funziona meglio del metodo / sys / module / battery: I miei due desktop Ubuntu 14.04 rispondono rispettivamente a "Desktop" e "Low Profile Desktop" e quello con CentOS 6.5 dice "Sconosciuto". Quello con CentOS 5.3 non riconosce la parola chiave "tipo di telaio". Il portatile su cui l'ho provato dice "Notebook". Ma è uno svantaggio che è necessario l'accesso come root.
Thomas Padron-McCarthy,

Mi piace molto questa risposta!
Lembik,

+1 per l'indipendenza della distribuzione. L'ho provato con successo su diverse macchine. L'unico computer su cui dmidecode ha dato una risposta meno utile è stato un netbook Aspire che ha restituito un tipo di chassis Other.
Giovanni 1024,

questa risposta richiede sudo, quindi non è praticabile per cose come i .bashrcfile. Interrogare il contenuto di /sys/class/dmi/id/chassis_type, che è solo un singolo numero, è molto meglio (come sottolineato un'altra risposta di seguito).
xdavidliu,

9

Soluzione Debian:

Per scoprire se una macchina che esegue Debian è un laptop, prova:

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

Questo approccio non richiede rootprivilegi.

Su altre distribuzioni, tuttavia, questa directory sembra esistere, almeno in forma di scheletro, indipendentemente dal fatto che ci sia o meno una batteria. Dai commenti (sotto), queste distribuzioni includono CentOS, Ubuntu e la distribuzione derivata da Ubuntu di Linux Mint.

Soluzione più generale

Sebbene non funzioni sui miei sistemi Debian, secondo quanto riferito la soluzione proposta da Alex funziona su Ubuntu e CentOS. Pertanto suggerisce, per maggior generalità, una possibile soluzione combinata:

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

Questo approccio non richiede rootprivilegi.

Più dettagli

Su un sistema Debian con una batteria reale, la /sys/module/batterydirectory contiene molti file. Uno di questi file è /sys/module/battery/initstateche contiene il testo live. Su Ubuntu, tuttavia, questi file non esistono nemmeno su laptop reali. Quindi, sembra che la presenza del file /sys/module/battery/initstatepossa essere usata per testare un laptop che esegue Debian.

Sui sistemi Debian che ho testato, al contrario, la /proc/acpi/batterydirectory non esisteva.


1
Non è possibile che il secondo comando possa tornare vero nel caso di un desktop con un UPS?
PseudoPsyche,

3
@PseudoPsyche L'ho appena testato su un desktop con un UPS e ha restituito false (non un laptop).
Giovanni 1024,

1
Cosa ci fa quel primo comando lì?
AndreKR,

1
Apparentemente il mio server IBM 4U con uno SmartUPS APC collegato tramite USB è un laptop. Certamente non vorrei quella cosa in grembo tutto il giorno! (ovvero, se ha un UPS collegato e configurato per l'arresto / monitoraggio, tale directory esisterà)
Concedi il

1
@Chipperyman "Un UPS non va tra la presa a muro e la presa di corrente del computer?" Sì, e molte configurazioni UPS, incluso il livello consumer, consentono di collegare un cavo USB per ottenere informazioni sulla batteria e avvisi sul desktop.
Jake:

8

Verificherei se sul computer è installata una batteria. E il seguente è un modo per testare:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi

Questo metodo ha dato la risposta corretta su tutti e cinque i computer su cui l'ho provato: due desktop con Ubuntu 14.04, un desktop con CentOS 5.3, un desktop con CentOS 6.5 e un laptop con Ubuntu 14.04. Inoltre, non richiede l'accesso come root. Dei tre metodi nelle risposte, i miei test indicano che questo può, provvisoriamente, essere il migliore.
Thomas Padron-McCarthy,

Questo funziona per me.
Lembik,

Questo non ha funzionato sui due laptop Debian che ho testato ma +1 per lavorare su una varietà di altre importanti distribuzioni.
Giovanni 1024,

Non funziona per me (Toshiba Notebook), perché la mia batteria si chiama BAT1. Non so quanti altri possibili nomi potrebbero esserci.
Joe,

@Joe Passa BAT0a BAT*: dovrebbe rilevare tutte le variazioni.
Alex,

8

Per evitare di usare sudo, puoi leggere il contenuto di /sys/class/dmi/id/chassis_type. Sembra conforme alla seguente tabella:

  • 1 Altro
  • 2 Sconosciuto
  • 3 Desktop
  • 4 Desktop di basso profilo
  • 5 Pizza Box
  • 6 Mini Tower
  • 7 Tower
  • 8 portatile
  • 9 laptop
  • 10 Notebook
  • 11 tenuto in mano
  • 12 Docking Station
  • 13 Tutto in uno
  • 14 Notebook secondario
  • 15 Salvaspazio
  • 16 Lunch Box
  • 17 Chassis del sistema principale
  • 18 Chassis di espansione
  • 19 Sottotelaio
  • 20 Chassis di espansione del bus
  • 21 Chassis periferico
  • 22 Chassis di archiviazione
  • 23 Telaio per montaggio su rack
  • 24 PC con custodia sigillata

Fonte per la tabella? E "lunch box" è uno scherzo ?!
OJFord

1
@OJFord Al momento non ho una citazione. Per quanto riguarda "lunchbox", è un soprannome dato a un fattore di forma. Ho già lavorato con alcuni lunchbox e pizzabox. Anche se questo link potrebbe non durare anni, puoi vedere alcuni computer lunchbox molto moderni theportablepc.com/portable-pc.html
demure

1
La risposta di Grant contiene una citazione di microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/…
demure

Grazie! Ora ne voglio uno ... Ma sospetto che il mio portafoglio non lo faccia.
OJFord,

Questa è stata l'unica soluzione che ha funzionato per me senza bisogno di sudo. Le soluzioni basate sulla batteria dicevano che il mio desktop Ubuntu era un laptop o che il mio laptop debian era un desktop.
xdavidliu,

1

Se il controllo dell'esistenza della batteria è abbastanza buono, puoi usare questa funzione shell:

# 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
}

Lo uso su Debian da anni. Nota che funziona anche con Debian in esecuzione in WSL o virtualbox.

Modifica: generalizzato da altre risposte in questo thread per catturare più casi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.