Déterminer par programme si un script est exécuté sur un ordinateur portable ou de bureau?

18

Existe-t-il un moyen fiable de déterminer (par programme) à partir d'un script bash s'il est exécuté sur un ordinateur portable ou un ordinateur de bureau?

Je pourrais évidemment inviter simplement l'utilisateur à leur demander, mais c'est assez maladroit.

PseudoPsyche
la source
1
Je dirais pourquoi tu as besoin de savoir? Êtes-vous inquiet de la durée de vie de la batterie
Rich Homolka
3
Le script effectue une configuration du système pour l'utilisateur, et en partie la configuration de certains paramètres d'économie d'énergie si l'appareil est un ordinateur portable.
PseudoPsyche

Réponses:

29

Il n'est pas fiable de savoir si le système est équipé d'une batterie ou non - un onduleur connecté au système (non seulement pour l'alimentation, mais également via USB pour l'arrêt automatique et la surveillance de la batterie) peut apparaître comme une batterie.

Il existe cependant un bon moyen fiable:

dmidecode --string chassis-type

Sur un ordinateur portable, cela renverra l'un des "Laptop", "Notebook" "Portable" ou "Sub Notebook" (selon ce que le fabricant a codé dans le BIOS). Il existe une liste complète des valeurs possibles dans « Identification du type de châssis d'un ordinateur » dans le Guide de script de Windows 2000 - ne vous inquiétez pas qu'il s'agisse d'une page Microsoft TechNet, ce n'est pas spécifique au système d'exploitation.

dmidecode peut également obtenir des informations sur le fabricant du matériel, le numéro de série du système (parfois), etc.

Subvention
la source
J'ai un onduleur contrôlé via USB pour l'arrêt automatique et la surveillance de la batterie avec Network UPS Tool . Il n'apparaît pas comme une "batterie" sur le bureau. Dans quelle configuration utilisez-vous celle sous laquelle un onduleur apparaît /sys/module/battery?
John1024
Cela fonctionne mieux que la méthode / sys / module / battery: mes deux postes de travail Ubuntu 14.04 répondent respectivement "Bureau" et "Bureau à profil bas", et celui avec CentOS 6.5 dit "Inconnu". Celui avec CentOS 5.3 ne reconnaît pas le mot-clé "châssis-type". L'ordinateur portable sur lequel j'ai essayé indique "Notebook". Mais c'est un inconvénient que vous avez besoin d'un accès root.
Thomas Padron-McCarthy
J'aime vraiment cette réponse!
Lembik
+1 pour l'indépendance de la distribution. Je l'ai testé avec succès sur plusieurs machines. La seule machine sur laquelle dmidecode a donné une réponse moins qu'utile était un netbook Aspire retourné un type de châssis Other.
John1024
cette réponse nécessite sudo, elle n'est donc pas viable pour des choses comme les .bashrcfichiers. Interroger le contenu de /sys/class/dmi/id/chassis_type, qui n'est qu'un seul chiffre, est beaucoup mieux (comme l'a souligné une autre réponse ci-dessous).
xdavidliu
9

Solution Debian:

Pour savoir si une machine exécutant Debian est un ordinateur portable, essayez:

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

Cette approche ne nécessite pas de rootprivilèges.

Sur d'autres distributions, cependant, ce répertoire semble exister, au moins sous forme de squelette, qu'il y ait ou non une batterie. D'après les commentaires (ci-dessous), ces distributions incluent CentOS, Ubuntu et la distribution dérivée d'Ubuntu de Linux Mint.

Solution plus générale

Bien qu'elle ne fonctionne pas sur mes systèmes Debian, la solution proposée par Alex fonctionnerait sur Ubuntu & CentOS. Suggère donc, pour une plus grande généralité, une solution combinée possible:

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

Cette approche ne nécessite pas de rootprivilèges.

Plus de détails

Sur un système Debian avec une batterie réelle, le /sys/module/batteryrépertoire contient de nombreux fichiers. Un de ces fichiers /sys/module/battery/initstatecontient le texte live. Sur Ubuntu, cependant, ces fichiers n'existent même pas sur les ordinateurs portables réels. Ainsi, il apparaît que la présence du fichier /sys/module/battery/initstatepeut être utilisée pour tester un ordinateur portable exécutant Debian.

Sur les systèmes Debian que j'ai testés, en revanche, le /proc/acpi/batteryrépertoire n'existait pas.

John1024
la source
1
N'est-il pas possible que la deuxième commande puisse toujours retourner vraie dans le cas d'un ordinateur de bureau avec un onduleur?
PseudoPsyche
3
@PseudoPsyche Je viens de le tester sur un ordinateur de bureau avec un onduleur et il est retourné faux (pas un ordinateur portable).
John1024
1
Que fait cette première commande là-bas?
AndreKR
1
Apparemment, mon serveur IBM 4U avec un APC SmartUPS branché sur USB est un ordinateur portable. Je ne voudrais certainement pas cette chose sur mes genoux toute la journée! (c.-à-d., si un onduleur est branché et configuré pour l'arrêt / la surveillance, ce répertoire existera)
Accordez le
1
@Chipperyman "Un onduleur ne passe-t-il pas entre la prise murale et la prise d'alimentation d'un ordinateur?" Oui, et de nombreuses configurations d'onduleur, y compris au niveau des consommateurs, vous permettent de brancher un câble USB pour obtenir des informations sur la batterie et des alertes sur votre bureau.
JakeGould
8

Je vérifierais si l'ordinateur a une batterie installée. Et ce qui suit est une façon de tester:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Alex
la source
Cette méthode a donné la bonne réponse sur les cinq ordinateurs sur lesquels j'ai essayé: deux bureaux avec Ubuntu 14.04, un bureau avec CentOS 5.3, un bureau avec CentOS 6.5 et un ordinateur portable avec Ubuntu 14.04. De plus, il ne nécessite pas d'accès root. Des trois méthodes dans les réponses, mes tests indiquent que celle-ci peut être, en principe, la meilleure.
Thomas Padron-McCarthy
Cela fonctionne pour moi.
Lembik
Cela n'a pas fonctionné sur les deux ordinateurs portables Debian que j'ai testés, mais +1 pour avoir travaillé sur une variété d'autres distributions importantes.
John1024
Ne fonctionne pas pour moi (Toshiba Notebook), car ma batterie s'appelle BAT1. Je ne sais pas combien d'autres noms pourraient exister.
Joe
@Joe Changer BAT0pour BAT*- il devrait détecter toutes les variations.
Alex
8

Pour éviter d'utiliser sudo, vous pouvez lire le contenu de /sys/class/dmi/id/chassis_type. Il semble conforme au tableau suivant:

  • 1 Autre
  • 2 Inconnu
  • 3 Bureau
  • 4 Bureau à profil bas
  • 5 Pizza Box
  • 6 Mini tour
  • 7 Tour
  • 8 Portable
  • 9 Ordinateur portable
  • 10 cahier
  • 11 Hand Held
  • 12 Station d'accueil
  • 13 Tout en un
  • 14 Sub Notebook
  • 15 gain de place
  • 16 Boîte à lunch
  • 17 Châssis principal du système
  • 18 châssis d'extension
  • 19 Sous-châssis
  • Châssis d'extension de 20 bus
  • 21 Châssis périphérique
  • 22 châssis de stockage
  • 23 Châssis à montage en rack
  • 24 PC à boîtier scellé
sage
la source
Source pour le tableau? Et la «boîte à lunch» est-elle une blague?!
OJFord
1
@OJFord Je n'ai pas de citation pour le moment. En ce qui concerne la «boîte à lunch», c'est un surnom donné à un facteur de forme. J'ai déjà travaillé avec quelques boîtes à lunch et pizzabox. Bien que ce lien ne peut pas durer des années, vous pouvez voir certains ordinateurs lunchbox très modernes theportablepc.com/portable-pc.html
Demure
1
La réponse de Grant contient une citation de Microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/...
pudique
Merci! Maintenant j'en veux un ... Mais je soupçonne que mon portefeuille ne le fait pas.
OJFord
C'était la seule solution qui fonctionnait pour moi sans avoir besoin de sudo. Les solutions basées sur la batterie ont soit indiqué que mon ordinateur de bureau Ubuntu était un ordinateur portable, soit que mon ordinateur portable Debian était un ordinateur de bureau.
xdavidliu
1

Si la vérification de l'existence de la batterie est suffisante, vous pouvez utiliser cette fonction 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
}

Je l'utilise sur Debian depuis des années. Notez que cela fonctionne également pour Debian fonctionnant dans WSL ou virtualbox.

Edit: généralisé à partir d'autres réponses dans ce fil pour attraper plus de cas.

laur
la source