Determinar programaticamente se um script está sendo executado no laptop ou desktop?

18

Existe alguma maneira confiável de determinar (programaticamente) a partir de um script bash se ele está sendo executado em um laptop ou computador desktop?

Obviamente, eu poderia simplesmente solicitar ao usuário que perguntasse, mas isso é bastante desajeitado.

PseudoPsique
fonte
11
Eu diria por que você precisa saber? Você está preocupado com a vida da bateria
rico Homolka
3
O script está fazendo algumas configurações do sistema para o usuário, e parte disso é definir algumas configurações de economia de energia se o dispositivo for um laptop.
PseudoPsyche 17/02

Respostas:

29

Analisar se o sistema possui ou não uma bateria não é confiável - um no-break conectado ao sistema (não apenas para alimentação, mas também via USB, para desligamento automático e monitoramento da bateria) pode aparecer como uma bateria.

No entanto, existe uma maneira confiável e agradável:

dmidecode --string chassis-type

Em um laptop, isso retornará um de "Laptop", "Notebook" "Portable" ou "Sub Notebook" (dependendo do que o fabricante codificou no BIOS). Há uma lista completa de valores possíveis em " Identificando o tipo de chassi de um computador " no Guia de script do Windows 2000 - não se preocupe por ser uma página do Microsoft TechNet, isso não é específico do sistema operacional.

O dmidecode também pode obter informações sobre o fabricante do hardware, o número de série do sistema (às vezes) etc.

Conceder
fonte
Eu tenho um no-break controlado via USB para desligamento automático e monitoramento de bateria com o Network UPS Tool . É que não mostrar-se como uma "bateria" na área de trabalho. Em que configuração você está usando aquele em que um no-break aparece /sys/module/battery?
John1024
Isso funciona melhor que o método / sys / module / battery: Meus dois desktops Ubuntu 14.04 respondem "Desktop" e "Low Profile Desktop", respectivamente, e o do CentOS 6.5 diz "Unknown". Aquele com o CentOS 5.3 não reconhece a palavra-chave "tipo de chassi". O laptop em que experimentei diz "Notebook". Mas é uma desvantagem que você precisa de acesso root.
Thomas Padron-McCarthy
Eu realmente gosto desta resposta!
Lembik
+1 para independência de distribuição. Eu testei com sucesso em várias máquinas. A única máquina na qual o dmidecode deu uma resposta menos que útil foi um netbook Aspire retornou um tipo de chassi Other.
John1024
esta resposta requer sudo, portanto não é viável para coisas como .bashrcarquivos. Consultar o conteúdo de /sys/class/dmi/id/chassis_type, que é apenas um único número, é muito melhor (como outra resposta abaixo apontou).
xdavidliu
9

Solução Debian:

Para descobrir se uma máquina executando o Debian é um laptop, tente:

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

Essa abordagem não requer rootprivilégios.

Em outras distribuições, no entanto, esse diretório parece existir, pelo menos na forma de esqueleto, independentemente de haver ou não uma bateria. A partir dos comentários (abaixo), essas distribuições incluem o CentOS, Ubuntu e a distribuição do Linux Mint derivada do Ubuntu.

Solução mais geral

Embora não funcione nos meus sistemas Debian, a solução proposta por Alex supostamente funciona no Ubuntu e no CentOS. Assim, sugere, para maior generalidade, uma possível solução combinada:

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

Essa abordagem não requer rootprivilégios.

Mais detalhes

Em um sistema Debian com uma bateria real, o /sys/module/batterydiretório contém muitos arquivos. Um desses arquivos é o /sys/module/battery/initstateque contém o texto live. No Ubuntu, no entanto, esses arquivos não existem mesmo em laptops reais. Portanto, parece que a presença do arquivo /sys/module/battery/initstatepode ser usada para testar um laptop executando o Debian.

Nos sistemas Debian que testei, pelo contrário, o /proc/acpi/batterydiretório não existia.

John1024
fonte
11
Não é possível que o segundo comando ainda possa retornar verdadeiro no caso de uma área de trabalho com um no-break?
PseudoPsyche 13/02/2015
3
@PseudoPsyche Acabei de testá-lo em um desktop com um no-break e ele retornou falso (não um laptop).
John1024
11
O que esse primeiro comando está fazendo lá?
AndreKR 14/02
11
Aparentemente, meu servidor IBM 4U com um APC SmartUPS conectado via USB é um laptop. Eu certamente não iria querer essa coisa no meu colo o dia todo! (ou seja, se tiver uma UPS ligado e configurado para desligar / monitorização, que directório existirá)
Grant
11
@Chipperyman “Um no-break não fica entre a tomada da parede e a de um computador?” Sim, e muitas configurações do no-break - incluindo o nível do consumidor - permitem conectar um cabo USB para obter informações e alertas sobre a bateria na área de trabalho.
JakeGould
8

Eu verificaria se o computador tem uma bateria instalada. E o seguinte é uma maneira de testar:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Alex
fonte
Esse método deu a resposta correta nos cinco computadores em que experimentei: dois desktops com Ubuntu 14.04, um desktop com CentOS 5.3, um desktop com CentOS 6.5 e um laptop com Ubuntu 14.04. Além disso, não requer acesso root. Dos três métodos nas respostas, meus testes indicam que esse pode ser, provisoriamente, o melhor.
Thomas Padron-McCarthy
Isso funciona para mim.
Lembik
Isso não funcionou nos dois laptops Debian que testei, mas +1 por trabalhar em várias outras distribuições importantes.
John1024
Não funciona para mim (Toshiba Notebook), porque minha bateria se chama BAT1. Não sei quantos outros nomes possíveis podem existir.
21415 Joe
@ Joe Alterar BAT0para BAT*- deve detectar todas as variações.
21415 Alex
8

Para evitar o uso do sudo, você pode ler o conteúdo de /sys/class/dmi/id/chassis_type. Parece estar em conformidade com a seguinte tabela:

  • 1 Outro
  • 2 Desconhecido
  • 3 Área de trabalho
  • 4 Desktop de baixo perfil
  • 5 Pizza Box
  • 6 Mini-torre
  • 7 torre
  • 8 Portátil
  • 9 Computador portátil
  • 10 Notebook
  • 11 Hand Held
  • 12 Estação de ancoragem
  • 13 Tudo em um
  • 14 Sub Notebook
  • 15 Economia de espaço
  • 16 Lunch Box
  • 17 Chassi do sistema principal
  • 18 Chassis de Expansão
  • 19 SubChassis
  • Chassi de expansão de 20 barramentos
  • 21 chassi periférico
  • 22 Chassi de armazenamento
  • 23 Chassi de montagem em rack
  • 24 PC com caixa selada
recatado
fonte
Fonte para a tabela? E 'lancheira' é uma piada ?!
OJFord
11
@OJFord Não tenho uma citação no momento. No que diz respeito a 'lancheira', é um apelido atribuído a um fator de forma. Já trabalhei com algumas lancheiras e pizzaboxes antes. Embora esse link possa não durar anos, você pode ver alguns computadores de lanchonete
demure
11
A resposta de Grant contém uma citação da microsoft: docs.microsoft.com/pt-br/previous-versions/tn-archive/…
demure
Obrigado! Agora eu quero uma ... Mas suspeito que minha carteira não.
OJFord
Esta foi a única solução que funcionou para mim sem a necessidade de sudo. As soluções baseadas em bateria diziam que meu desktop ubuntu era um laptop ou que meu laptop debian era um desktop.
xdavidliu 5/10
1

Se a verificação da existência da bateria for boa o suficiente, você poderá usar esta função 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
}

Estou usando isso no Debian há anos. Note que isso também funciona para o Debian em execução no WSL ou no VirtualBox.

Editar: generalizado de outras respostas neste tópico para capturar mais casos.

laur
fonte