¿Determinar programáticamente si un script se está ejecutando en una computadora portátil o de escritorio?


18

¿Hay alguna forma confiable de determinar (mediante programación) desde un script bash si se ejecuta en una computadora portátil o de escritorio?

Obviamente, podría pedirle al usuario que les pregunte, pero eso es bastante torpe.


1
Yo diría por qué necesitas saber? ¿Te preocupa la duración de la batería?
Rich Homolka

3
La secuencia de comandos está haciendo una configuración del sistema para el usuario, y parte de eso está configurando algunos ajustes de ahorro de energía si el dispositivo es una computadora portátil.
PseudoPsyche

Respuestas:


29

Observar si el sistema tiene o no una batería no es confiable: un UPS conectado al sistema (no solo por alimentación, sino también por USB para apagado automático y monitoreo de batería) puede aparecer como una batería.

Sin embargo, hay una buena manera confiable:

dmidecode --string chassis-type

En una computadora portátil, esto devolverá uno de "Laptop", "Notebook", "Portable" o "Sub Notebook" (según lo que el fabricante haya codificado en el BIOS). Hay una lista completa de posibles valores en " Identificación del tipo de chasis de una computadora " en la Guía de secuencias de comandos de Windows 2000; no se preocupe por ser una página de Microsoft TechNet, esto no es específico del sistema operativo.

dmidecode también puede obtener información sobre el fabricante del hardware, el número de serie del sistema (a veces), etc.


Tengo un UPS controlado por USB para apagado automático y monitoreo de batería con Network UPS Tool . Es no no aparecer como una "batería" en el escritorio. ¿En qué configuración está usando esa en la que aparece un UPS /sys/module/battery?
John1024

Esto funciona mejor que el método / sys / module / battery: mis dos escritorios Ubuntu 14.04 responden "Escritorio" y "Escritorio de bajo perfil", respectivamente, y el que tiene CentOS 6.5 dice "Desconocido". El que tiene CentOS 5.3 no reconoce la palabra clave "tipo chasis". La computadora portátil que probé dice "Notebook". Pero es un inconveniente que necesita acceso root.
Thomas Padron-McCarthy

¡Realmente me gusta esta respuesta!
Lembik

+1 para distribución independiente. Lo probé con éxito en varias máquinas. La única máquina en la que dmidecode dio una respuesta menos que útil fue una netbook Aspire que devolvió un tipo de chasis Other.
John1024

esta respuesta requiere sudo, por lo que no es viable para cosas como .bashrcarchivos. Consultar el contenido de /sys/class/dmi/id/chassis_type, que es solo un número, es mucho mejor (como señaló otra respuesta a continuación).
xdavidliu

9

Solución Debian:

Para saber si una máquina que ejecuta Debian es una computadora portátil, intente:

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

Este enfoque no requiere rootprivilegios.

Sin embargo, en otras distribuciones, este directorio parece existir, al menos en forma de esqueleto, independientemente de si hay o no una batería. De los comentarios (a continuación), estas distribuciones incluyen CentOS, Ubuntu y la distribución de Linux Mint derivada de Ubuntu.

Solución más general

Aunque no funciona en mis sistemas Debian, la solución propuesta por Alex funciona en Ubuntu y CentOS. Por lo tanto, sugiere, para una mayor generalidad, una posible solución combinada:

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

Este enfoque no requiere rootprivilegios.

Más detalles

En un sistema Debian con una batería real, el /sys/module/batterydirectorio contiene muchos archivos. Uno de esos archivos es el /sys/module/battery/initstateque contiene el texto live. Sin embargo, en Ubuntu, estos archivos no existen incluso en las computadoras portátiles reales. Por lo tanto, parece que la presencia del archivo /sys/module/battery/initstatese puede utilizar para probar una computadora portátil con Debian.

En los sistemas Debian que probé, por el contrario, el /proc/acpi/batterydirectorio no existía.


1
¿No es posible que el segundo comando aún pueda ser verdadero en el caso de un escritorio con un UPS?
PseudoPsyche

3
@PseudoPsyche Lo acabo de probar en una computadora de escritorio con un UPS y me devolvió falso (no una computadora portátil).
John1024

1
¿Qué está haciendo ese primer comando allí?
AndreKR

1
Aparentemente, mi servidor IBM 4U con un APC SmartUPS conectado a través de USB es una computadora portátil. ¡Ciertamente no querría esa cosa en mi regazo todo el día! (es decir, si tiene un UPS enchufado y configurado para apagado / monitoreo, ese directorio existirá)
Otorgue

1
@Chipperyman “¿No se conecta un UPS entre la toma de corriente y la toma de corriente de la computadora?” Sí, y muchas configuraciones de UPS, incluido el nivel del consumidor, le permiten conectar un cable USB para obtener información de la batería y alertas en su escritorio.
JakeGould

8

Verificaría si la computadora tiene una batería instalada. Y la siguiente es una forma de probar:

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

Este método dio la respuesta correcta en las cinco computadoras en las que lo probé: dos computadoras de escritorio con Ubuntu 14.04, una computadora de escritorio con CentOS 5.3, una computadora de escritorio con CentOS 6.5 y una computadora portátil con Ubuntu 14.04. Además, no requiere acceso de root. De los tres métodos en las respuestas, mis pruebas indican que este puede ser, tentativamente, el mejor.
Thomas Padron-McCarthy

Esto funciona para mi.
Lembik

Esto no funcionó en las dos computadoras portátiles Debian que probé, pero hice +1 por trabajar en una variedad de otras distribuciones importantes.
John1024

No funciona para mí (Toshiba Notebook), porque mi batería se llama BAT1. No sé cuántos otros posibles nombres podría haber.
Joe

@Joe Change BAT0to BAT*: debería detectar todas las variaciones.
Alex

8

Para evitar usar sudo, puede leer el contenido de /sys/class/dmi/id/chassis_type. Parece cumplir con la siguiente tabla:

  • 1 otro
  • 2 Desconocido
  • 3 escritorio
  • 4 Escritorio de bajo perfil
  • 5 caja de pizza
  • 6 mini torre
  • 7 torre
  • 8 portátiles
  • 9 laptop
  • 10 cuaderno
  • 11 de mano
  • 12 estación de acoplamiento
  • 13 todo en uno
  • 14 sub cuaderno
  • 15 Ahorro de espacio
  • 16 lonchera
  • 17 Chasis del sistema principal
  • 18 chasis de expansión
  • 19 SubChassis
  • 20 Chasis de expansión de bus
  • 21 chasis periférico
  • 22 chasis de almacenamiento
  • 23 chasis de montaje en bastidor
  • 24 PC con carcasa sellada

Fuente de la mesa? ¿Y es una broma "box lunch"?
OJFord

1
@OJFord No tengo una cita en este momento. En cuanto a 'lunchbox', es un apodo dado a un factor de forma. He trabajado con algunas loncheras y cajas de pizza antes. Si bien este enlace puede no durar años, puede ver algunas computadoras muy modernas en la lonchera theportablepc.com/portable-pc.html
recatada el

1
La respuesta de Grant contiene una cita de microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/…
recatada

¡Gracias! Ahora quiero uno ... Pero sospecho que mi billetera no.
OJFord

Esta fue la única solución que funcionó para mí sin necesidad de sudo. Las soluciones basadas en baterías decían que mi computadora de escritorio ubuntu era una computadora portátil o que mi computadora portátil debian era una computadora de escritorio.
xdavidliu

1

Si verificar la existencia de la batería es lo suficientemente bueno, puede usar esta función de 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
}

He estado usando esto en Debian durante años. Tenga en cuenta que esto también funciona para Debian ejecutándose en WSL o virtualbox.

Editar: generalizado de otras respuestas en este hilo para capturar más casos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.