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


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.