Программно определить, выполняется ли сценарий на ноутбуке или настольном компьютере?


18

Есть ли надежный способ (программно) определить из сценария bash, выполняется ли он на ноутбуке или настольном компьютере?

Очевидно, я мог бы просто попросить пользователя спросить их, но это довольно неуклюже.


1
Я бы сказал, почему вы должны знать? Вы беспокоитесь о времени автономной работы
— Rich Homolka

3
Сценарий выполняет некоторые настройки системы для пользователя, и часть этого - настройка некоторых параметров энергосбережения, если устройство является ноутбуком.
— ПсевдоПсихе

Ответы:


29

Ненадежность проверки того, есть ли в системе аккумулятор, не соответствует действительности - ИБП, подключенный к системе (не только для питания, но и через USB, а также для автоматического отключения и мониторинга аккумулятора), может отображаться в качестве аккумулятора.

Однако есть хороший надежный способ:

dmidecode --string chassis-type

На ноутбуке будет возвращено одно из следующих значений: «Портативный компьютер», «Портативный компьютер», «Портативный» или «Дополнительный ноутбук» (в зависимости от того, что производитель закодировал в BIOS). Полный список возможных значений приведен в разделе « Определение типа корпуса компьютера » в Руководстве по созданию сценариев Windows 2000 - не беспокойтесь, если это страница Microsoft TechNet, это не зависит от конкретной ОС.

dmidecode также может получить информацию о производителе оборудования, серийном номере системы (иногда) и т. д.


У меня есть ИБП, управляемый через USB для автоматического выключения и мониторинга батареи с помощью Network UPS Tool . Это не отображается как «батарея» на рабочем столе. В какой конфигурации вы используете ту, в которой появляется ИБП /sys/module/battery?
— John1024

Это работает лучше, чем метод / sys / module / battery: два моих рабочих стола Ubuntu 14.04 отвечают «Рабочий стол» и «Низкопрофильный рабочий стол» соответственно, а тот, что с CentOS 6.5, говорит «Неизвестно». Тот, в котором CentOS 5.3 не распознает ключевое слово "тип шасси". Ноутбук, на котором я его пробовал, говорит: «Ноутбук». Но это недостаток, что вам нужен root-доступ.
— Томас Падрон-Маккарти

Мне очень нравится этот ответ!
— Лембик

+1 за независимость распределения. Я успешно проверил его на нескольких машинах. Единственный компьютер, на котором dmidecode дал менее чем полезный ответ, был нетбук Aspire, возвращавший тип шасси Other.
— John1024

этот ответ требует sudo, поэтому не подходит для таких вещей, как .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, решение, предложенное Алексом, работает на 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 в случае рабочего стола с ИБП?
— ПсевдоПсихе

3
@PseudoPsyche Я только что проверил его на рабочем столе с ИБП, и он вернул false (не ноутбук).
— John1024

1
Что там делает эта первая команда?
— AndreKR

1
Очевидно, мой сервер IBM 4U с APC SmartUPS, подключенным через USB, - это ноутбук. Я, конечно, не хотел бы, чтобы эта вещь лежала у меня на коленях весь день! (т. е. если к нему подключен и настроен ИБП для отключения / мониторинга, этот каталог будет существовать)
— Грант

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. Кроме того, он не требует root-доступа. Мои тесты показывают, что из трех методов, представленных в ответах, это может быть лучшим.
— Томас Падрон-Маккарти

Это работает для меня.
— Лембик

Это не сработало на двух ноутбуках Debian, которые я тестировал, но +1 за работу над множеством других важных дистрибутивов.
— John1024

У меня не работает (ноутбук Toshiba), потому что моя батарея называется BAT1. Я не знаю, сколько других возможных имен может быть.
— Джо

@Joe Измените BAT0на BAT*- это должно обнаружить все изменения.
— Алекс

8

Чтобы не использовать sudo, вы можете прочитать содержимое /sys/class/dmi/id/chassis_type. Похоже, соответствуют следующей таблице:

  • 1 Другое
  • 2 Неизвестный
  • 3 Рабочий стол
  • 4 Низкопрофильный рабочий стол
  • 5 Pizza Box
  • 6 Мини Тауэр
  • 7 Башня
  • 8 Портативный
  • 9 Ноутбук
  • 10 ноутбуков
  • 11 Ручной
  • 12 док-станция
  • 13 все в одном
  • 14 Sub Notebook
  • 15 Экономия места
  • 16 Ланч-бокс
  • 17 Основное системное шасси
  • 18 шасси расширения
  • 19 SubChassis
  • 20 Шасси Расширения Шины
  • 21 периферийное шасси
  • 22 Шасси для хранения
  • 23 Шасси для монтажа в стойку
  • 24 Герметичный ПК

Источник для таблицы? А «шкатулка с ланчем» - шутка ?!
— OJFord

1
@OJFord У меня нет цитаты в это время. Что касается «ланч-бокса», то это прозвище дает форм-фактор. Я работал с несколькими коробками для завтрака и пиццебоками раньше. Хотя эта ссылка может отсутствовать в течение последних лет, вы можете увидеть некоторые очень современные компьютеры для ланч-
— скромно

1
Ответ Гранта содержит цитату из Майкрософта: docs.microsoft.com/en-us/previous-versions/tn-archive/...
— тихоня

Благодарность! Теперь я хочу один ... Но я подозреваю, что мой кошелек нет.
— OJFord

Это было единственное решение, которое сработало для меня без необходимости sudo. В решениях, основанных на использовании батарей, либо мой настольный компьютер 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.