Програматично визначити, чи виконується сценарій на ноутбуці чи настільному комп’ютері?


18

Чи є якийсь надійний спосіб визначити (програмно) зсередини bash-сценарію, якщо він виконується на ноутбуці чи настільному комп'ютері?

Я, очевидно, міг просто запропонувати користувачеві запитати їх, але це досить незграбно.


1
Я б сказав, навіщо вам це знати? Ви турбуєтеся про заряд акумулятора
Rich Homolka

3
Сценарій виконує певні налаштування системи для користувача, і частина цього - це налаштування деяких параметрів економії енергії, якщо пристрій є ноутбуком.
ПсевдоПсихея

Відповіді:


29

Дивлячись на те, чи є в системі акумулятор, не є надійним - UPS, підключений до системи (не тільки для живлення, але через USB, а також для автоматичного відключення та моніторингу акумулятора), може відображатися як акумулятор.

Однак є приємний надійний спосіб:

dmidecode --string chassis-type

На ноутбуці це поверне один із "Ноутбуків", "Ноутбуків", "Портативних" або "Підручників" (залежно від того, що виробник закодував у BIOS). Повний список можливих значень на сторінці " Визначення типу корпусу комп'ютера " в Посібнику з сценаріїв Windows 2000 - не хвилюйтеся, що це сторінка Microsoft TechNet, це не стосується ОС.

dmidecode також може отримати інформацію про виробника обладнання, серійний номер системи (іноді) тощо.


У мене є ДБЖ, керований через USB, для автоматичного відключення та моніторингу акумулятора за допомогою інструмента мережевого джерела живлення . Це не відображається як «акумулятор» на робочому столі. В якій конфігурації ви використовуєте конфігурацію, в якій з'являється ДБЖ /sys/module/battery?
John1024

Це працює краще, ніж метод / sys / module / battery: два моїх настільних комп'ютерів Ubuntu 14.04 відповідають відповідно «Desktop» та «Low Profile Desktop», а той із CentOS 6.5 говорить «Невідомо». Той, хто має CentOS 5.3, не розпізнає ключове слово "тип шасі". Ноутбук, на якому я його приміряв, пише "Блокнот". Але це недолік того, що вам потрібен кореневий доступ.
Томас Падрон-Маккарті

Мені дуже подобається ця відповідь!
Лембік

+1 за незалежність розповсюдження. Я успішно випробував це на кількох машинах. Єдиною машиною, на якій dmidecode дав менш корисну відповідь, був нетбук Aspire, який повернув тип шасі Other.
John1024

ця відповідь вимагає судо, тому не є життєздатним для таких речей, як .bashrcфайли. Запит на вміст /sys/class/dmi/id/chassis_type, який є лише одним числом, набагато краще (як вказується інша відповідь нижче).
xdavidliu

9

Рішення Debian:

Щоб дізнатись, чи є машина, на якій працює Debian, ноутбук, спробуйте:

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

Цей підхід не вимагає rootпільг.

Однак в інших дистрибутивах цей каталог, здається, існує, принаймні, в скелетному вигляді, незалежно від того, є чи немає акумулятора. З коментарів (нижче), ці дистрибутиви включають CentOS, Ubuntu та розподілену Ubuntu розподілу Linux Mint.

Більш загальне рішення

Хоча це не працює на моїх системах Debian, рішення, запропоноване Alex, як повідомляється, працює на Ubuntu & CentOS. Таким чином, для більшої загальності пропонується можливе комбіноване рішення:

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

Цей підхід не вимагає rootпільг.

Детальніше

У системі Debian з фактичним акумулятором /sys/module/batteryкаталог містить багато файлів. Один такий файл, /sys/module/battery/initstateякий містить текст live. Однак на Ubuntu ці файли не існують навіть на фактичних ноутбуках. Таким чином, виявляється, що наявність файлу /sys/module/battery/initstateможе бути використана для перевірки на ноутбук під управлінням Debian.

На системах Debian, які я тестував, навпаки, /proc/acpi/batteryкаталог не існував.


1
Чи не можливо, що друга команда все-таки може повернути true у випадку робочого столу з UPS?
ПсевдоПсихея

3
@PseudoPsyche Я просто тестував це на робочому столі з ДБЖ, і він повернув помилку (не ноутбук).
John1024

1
Що там робить перша команда?
AndreKR

1
Мабуть, мій сервер 4U IBM із APC SmartUPS, підключеним через USB, - це ноутбук. Я, звичайно, не хотів би, щоб ця річ була на колінах цілий день! (тобто, якщо у нього підключено UPS та налаштовано для відключення / моніторингу, цей каталог буде існувати)
Грант

1
@Chipperyman "Чи не перебуває ДБЖ між розеткою та розеткою комп'ютера?" Так, і багато налаштувань ДБЖ, включаючи рівень споживачів, дозволяють підключити USB-кабель, щоб отримати інформацію про акумулятор та сповіщення на робочому столі.
JakeGould

8

Я б перевірив, чи на комп’ютері встановлено акумулятор. І ось один із способів тестування:

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

Цей метод дав правильну відповідь на всіх п’яти комп’ютерах, на яких я спробував: два робочих столу з Ubuntu 14.04, один робочий стіл з CentOS 5.3, один робочий стіл з CentOS 6.5 і один ноутбук з Ubuntu 14.04. Крім того, він не потребує кореневого доступу. З трьох методів у відповідях мої тести вказують, що це, орієнтовно, може бути найкращим.
Томас Падрон-Маккарті

Це працює для мене.
Лембік

Це не працювало на двох ноутбуках Debian, які я тестував, але +1 для роботи над різними іншими важливими дистрибутивами.
John1024

Не працює для мене (Toshiba Notebook), оскільки мій акумулятор названий BAT1. Я не знаю, скільки може бути інших імен.
Джо

@Joe Змінити BAT0на BAT*- він повинен виявити всі зміни.
Олексій

8

Щоб уникнути використання судо, ви можете прочитати вміст /sys/class/dmi/id/chassis_type. Здається, відповідає такій таблиці:

  • 1 Інше
  • 2 Невідомо
  • 3 Настільний
  • 4 Низький профіль робочого столу
  • 5 ящик для піци
  • 6 Міні-вежа
  • 7 Вежа
  • 8 Портативний
  • 9 Ноутбук
  • 10 Зошит
  • 11 Рука тримається
  • 12 Док-станція
  • 13 Все в одному
  • 14 Підручник
  • 15 Економія простору
  • 16 Коробка обіду
  • 17 Основне шасі системи
  • 18 Шасі розширення
  • 19 SubChassis
  • 20 Шасі розширення шини
  • 21 Периферійне шасі
  • 22 Шасі зберігання
  • 23 Шасі кріплення на рейці
  • 24 ПК із герметичним корпусом

Джерело для таблиці? І це «ящик для обіду» - жарт ?!
OJFord

1
@OJFord У мене наразі немає цитування. Що стосується "ланчбокса", то це фактор, який дає фактор форми. Я раніше працював з кількома коробками для сніданку та піцами. Хоча ця посилання може не в останні роки, ви можете побачити деякі дуже сучасні Закуска комп'ютери theportablepc.com/portable-pc.html
тихоня

1
Відповідь Гранта містить цитату з Майкрософта: docs.microsoft.com/en-us/previous-versions/tn-archive / ...
тихоня

Спасибі! Зараз я хочу його ... Але я підозрюю, що мій гаманець не відповідає.
OJFord

Це було єдине рішення, яке працювало на мене, не потребуючи судо. Рішення, що базуються на батареях, або говорили, що мій робочий стіл ubuntu - це ноутбук, або сказали, що мій ноутбук Debian - робочий стіл.
xdavidliu

1

Якщо перевірка наявності акумулятора досить хороша, ви можете використовувати цю функцію оболонки:

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

Використовую це на Debian роками. Зверніть увагу, це працює також для Debian, що працює в WSL або virtualbox.

Редагувати: узагальнено з інших відповідей у ​​цій темі, щоб знайти більше випадків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.