Programowo ustalić, czy skrypt jest wykonywany na laptopie czy komputerze stacjonarnym?

18

Czy istnieje jakiś niezawodny sposób na określenie (programowo) z poziomu skryptu bash, czy jest wykonywany na laptopie czy komputerze stacjonarnym?

Mógłbym oczywiście zachęcić użytkownika do zadawania pytań, ale jest to dość niezręczne.

PseudoPsyche
źródło
1
Powiedziałbym, dlaczego musisz wiedzieć? Martwisz się o czas pracy baterii
Rich Homolka
3
Skrypt wykonuje pewne ustawienia systemu dla użytkownika, a część z nich konfiguruje niektóre ustawienia oszczędzania energii, jeśli urządzenie jest laptopem.
PseudoPsyche

Odpowiedzi:

27

Sprawdzanie, czy system ma baterię, nie jest niezawodne - zasilacz UPS podłączony do systemu (nie tylko w celu zasilania, ale także przez USB, a także w celu automatycznego wyłączania i monitorowania baterii) może pojawić się jako bateria.

Istnieje jednak niezawodny sposób:

dmidecode --string chassis-type

Na laptopie zwróci jeden z „Laptop”, „Notebook”, „Portable” lub „Sub Notebook” (w zależności od tego, co producent zakodował w systemie BIOS). Pełna lista możliwych wartości znajduje się w „ Identyfikowaniu typu obudowy komputera ” w Przewodniku skryptów Windows 2000 - nie martw się, że jest to strona Microsoft TechNet, nie jest to specyficzne dla systemu operacyjnego.

Kod dmidecode może również uzyskać informacje o producencie sprzętu, numerze seryjnym systemu (czasami) itp.

Dotacja
źródło
Mam zasilacz UPS sterowany przez USB do automatycznego wyłączania i monitorowania baterii za pomocą Network UPS Tool . To nie nie pokazać się jako „baterii” na pulpicie. W jakiej konfiguracji korzystasz z tej, w której pojawia się UPS /sys/module/battery?
John1024
Działa to lepiej niż metoda / sys / module / battery: Moje dwa komputery Ubuntu 14.04 odpowiadają odpowiednio na „Desktop” i „Low Profile Desktop”, a ten z CentOS 6.5 mówi „Unknown”. Ten z CentOS 5.3 nie rozpoznaje słowa kluczowego „chassis-type”. Laptop, na którym wypróbowałem, mówi „Notebook”. Ale to wada, że ​​potrzebujesz dostępu do roota.
Thomas Padron-McCarthy
Naprawdę podoba mi się ta odpowiedź!
Lembik
+1 za niezależność dystrybucji. Testowałem to z powodzeniem na kilku komputerach. Jedyną maszyną, na której kod dmidecode dał mniej niż pomocną odpowiedź, był netbook Aspire zwrócił typ podwozia Other.
John1024
9

Rozwiązanie Debian:

Aby sprawdzić, czy komputer z systemem Debian jest laptopem, spróbuj:

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

To podejście nie wymaga rootuprawnień.

Jednak w innych dystrybucjach ten katalog wydaje się istnieć, przynajmniej w formie szkieletu, niezależnie od tego, czy jest bateria. Z komentarzy (poniżej), te dystrybucje obejmują CentOS, Ubuntu i pochodzącą z Ubuntu dystrybucję Linux Mint.

Bardziej ogólne rozwiązanie

Chociaż nie działa na moich systemach Debian, rozwiązanie zaproponowane przez Alexa podobno działa na Ubuntu i CentOS. Dlatego sugeruje, dla większej ogólności, możliwe połączone rozwiązanie:

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

To podejście nie wymaga rootuprawnień.

Więcej szczegółów

W systemie Debian z rzeczywistą baterią /sys/module/batterykatalog zawiera wiele plików. Jednym z takich plików jest /sys/module/battery/initstatetekst live. Jednak w Ubuntu pliki te nie istnieją nawet na rzeczywistych laptopach. Wygląda więc na to, że obecność pliku /sys/module/battery/initstatemoże być użyta do przetestowania laptopa z systemem Debian.

Natomiast w testowanych systemach Debian /proc/acpi/batterykatalog nie istniał.

John1024
źródło
1
Czy nie jest możliwe, że drugie polecenie nadal może być prawdziwe w przypadku komputera stacjonarnego z UPS?
PseudoPsyche
3
@PseudoPsyche Właśnie przetestowałem go na komputerze stacjonarnym z UPS-em i zwrócił fałsz (nie laptop).
John1024,
1
Co tam robi pierwsze polecenie?
AndreKR
1
Najwyraźniej mój serwer IBM 4U z APC SmartUPS podłączonym przez USB to laptop. Z pewnością nie chciałbym tego wszystkiego na kolanach przez cały dzień! (tzn. jeśli zasilacz UPS jest podłączony i skonfigurowany do wyłączania / monitorowania, ten katalog będzie istniał)
Grant
1
@Chipperyman „Czy UPS nie przechodzi między gniazdkiem ściennym a gniazdkiem zasilania komputera?” Tak, a wiele konfiguracji UPS - w tym na poziomie użytkownika - pozwala na podłączenie kabla USB, aby uzyskać informacje o baterii i alerty na pulpicie.
JakeGould
8

Sprawdziłbym, czy komputer ma zainstalowaną baterię. Oto jeden ze sposobów testowania:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Alex
źródło
Ta metoda dała prawidłową odpowiedź na wszystkich pięciu komputerach, na których wypróbowałem: dwa komputery z Ubuntu 14.04, jeden komputer z CentOS 5.3, jeden komputer z CentOS 6.5 i jeden laptop z Ubuntu 14.04. Ponadto nie wymaga dostępu do konta root. Z trzech metod zawartych w odpowiedziach moje testy wskazują, że może to być najlepsza z możliwych.
Thomas Padron-McCarthy
To działa dla mnie.
Lembik
Nie działało to na dwóch laptopach Debiana, które testowałem, ale daje +1 za pracę z wieloma innymi ważnymi dystrybucjami.
John1024,
Nie działa dla mnie (notebook Toshiba), ponieważ moja bateria nosi nazwę BAT1. Nie wiem, ile innych możliwych nazw może być.
Joe
@Joe Zmień BAT0na BAT*- powinien wykryć wszystkie odmiany.
Alex
6

Aby uniknąć używania sudo, możesz przeczytać zawartość /sys/class/dmi/id/chassis_type. Wygląda na to, że jest zgodny z następującą tabelą:

  • 1 Inne
  • 2 Nieznany
  • 3 Pulpit
  • 4 Niski profil pulpitu
  • 5 pudełek po pizzy
  • 6 Mini Tower
  • 7 Wieża
  • 8 Portable
  • 9 Laptop
  • 10 Notatnik
  • 11 Hand Held
  • 12 Stacja dokująca
  • 13 Wszystko w jednym
  • 14 Notatnik podrzędny
  • 15 Oszczędność miejsca
  • 16 Lunch Box
  • 17 Główne podwozie systemowe
  • 18 Podwozie rozszerzające
  • 19 SubChassis
  • 20 Podwozie rozszerzające magistralę
  • 21 Podwozie
  • 22 Podwozie do przechowywania
  • 23 Podwozie do montażu w szafie
  • 24 Sealed-Case PC
poważny
źródło
Źródło dla tabeli? I czy „pudełko na lunch” to żart ?!
OJFord
1
@OJFord W tej chwili nie mam cytatu. Jeśli chodzi o „lunchbox”, jest to pseudonim nadany formie. Wcześniej pracowałem z kilkoma pudełkami na lunch i pizzaboxami. Chociaż ten link może nie trwać latami, możesz zobaczyć niektóre bardzo nowoczesne komputery lunchbox theportablepc.com/portable-pc.html
demure
1
Odpowiedź Granta zawiera cytat z Microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/…
demure
Dzięki! Teraz chcę jeden ... Ale podejrzewam, że mój portfel nie.
OJFord
1

Jeśli sprawdzanie obecności baterii jest wystarczające, możesz użyć tej funkcji powłoki:

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

Używam tego na Debianie od lat. Zauważ, że działa to również dla Debiana działającego w WSL.

Edycja: uogólniona na podstawie innych odpowiedzi w tym wątku, aby złapać więcej przypadków.

Laur
źródło