프로그래밍 방식으로 스크립트가 랩톱 또는 데스크톱에서 실행되고 있는지 확인 하시겠습니까?


18

랩톱이나 데스크톱 컴퓨터에서 bash 스크립트가 실행되고 있는지 프로그래밍 방식으로 결정하는 신뢰할 수있는 방법이 있습니까?

분명히 사용자에게 물어 보라는 메시지를 표시 할 수는 있지만 매우 어수선합니다.


1
왜 알아야합니까? 배터리 수명이 걱정
되십니까

3
스크립트는 사용자를 위해 일부 시스템 설정을 수행하고 있으며 일부는 장치가 랩톱 인 경우 일부 절전 설정을 구성하고 있습니다.
PseudoPsyche

답변:


29

시스템에 배터리가 있는지 여부를 확인하는 것은 신뢰할 수 없습니다. UPS는 시스템에 연결된 (전원뿐만 아니라 USB를 통한 자동 종료 및 배터리 모니터링을 위해) 배터리로 표시 될 수 있습니다.

그러나 신뢰할 수있는 좋은 방법이 있습니다.

dmidecode --string chassis-type

랩톱에서는 "랩탑", "노트북" "휴대용"또는 "하위 노트북"중 하나를 반환합니다 (제조업체가 BIOS에 코딩 한 내용에 따라 다름). Windows 2000 스크립팅 안내서의 " 컴퓨터의 섀시 유형 식별 "에 가능한 값의 전체 목록이 있습니다 . Microsoft TechNet 페이지인지 걱정하지 마십시오. 이것은 OS에 특정한 것이 아닙니다.

dmidecode는 하드웨어 제조업체, 시스템 일련 번호 (때때로) 등에 대한 정보도 얻을 수 있습니다.


Network UPS Tool 로 자동 종료 및 배터리 모니터링을 위해 USB를 통해 제어되는 UPS가 있습니다. 데스크탑에서는 "배터리"로 표시 되지 않습니다 . UPS가 표시되는 구성을 사용하고 /sys/module/battery있습니까?
John1024

이것은 두 개의 우분투 14.04 데스크탑이 각각 "데스크톱"과 "로우 프로파일 데스크탑"으로 응답하고 CentOS 6.5가있는 데스크탑은 "알 수 없음"이라고 대답합니다. CentOS 5.3을 사용하는 키워드는 "chassis-type"이라는 키워드를 인식하지 못합니다. 내가 사용해 본 노트북에는 "노트북"이라고 표시되어 있습니다. 그러나 루트 액세스가 필요하다는 단점이 있습니다.
Thomas Padron-McCarthy

나는이 답변을 정말로 좋아한다!
Lembik

분포 독립성을 위해 +1. 여러 컴퓨터에서 성공적으로 테스트했습니다. dmidecode가 도움이되지 않는 유일한 대답을 한 기계는 Aspire 넷북이 섀시 유형을 반환했습니다 Other.
John1024

이 답변에는 sudo가 필요하므로 .bashrc파일 과 같은 것들에는 적합하지 않습니다 . /sys/class/dmi/id/chassis_type단 하나의 숫자 인의 내용을 쿼리하는 것이 훨씬 좋습니다 (아래 다른 대답이 지적했듯이).
xdavidliu

9

데비안 솔루션 :

데비안을 실행하는 머신이 노트북인지 확인하려면 다음을 시도하십시오.

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

이 방법에는 root권한 이 필요하지 않습니다 .

그러나 다른 배포판에서는 배터리가 있는지 여부에 관계 없이이 디렉토리가 적어도 골격 형태로 존재하는 것으로 보입니다. 주석 아래 (아래)에서 이러한 배포에는 CentOS, Ubuntu 및 Linux Mint의 Ubuntu 파생 배포가 포함됩니다.

더 일반적인 솔루션

내 데비안 시스템에서는 작동하지 않지만 Alex가 제안한 솔루션 은 Ubuntu & CentOS에서 작동한다고 알려져 있습니다. 따라서 일반화를 위해 가능한 조합 솔루션을 제안합니다.

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

이 방법에는 root권한 이 필요하지 않습니다 .

자세한 내용은

실제 배터리가 장착 된 데비안 시스템에서 /sys/module/battery디렉토리는 많은 파일을 포함합니다. 이러한 파일 중 하나 /sys/module/battery/initstate는 텍스트를 포함합니다 live. 그러나 우분투에서는 이러한 파일이 실제 랩톱에도 존재하지 않습니다. 따라서 파일 /sys/module/battery/initstate이 있으면 데비안을 실행하는 랩톱을 테스트하는 데 사용할 수 있습니다.

반대로 테스트 한 데비안 시스템에서는 /proc/acpi/battery디렉토리가 존재하지 않습니다.


1
UPS가있는 데스크탑의 경우 두 번째 명령이 여전히 true를 반환 할 수 없습니까?
PseudoPsyche

3
@PseudoPsyche 방금 UPS를 사용하여 데스크탑에서 테스트했으며 랩톱이 아닌 false를 반환했습니다.
John1024

1
그 첫 번째 명령은 무엇입니까?
AndreKR

1
USB를 통해 APC SmartUPS가 연결된 4U IBM 서버는 랩톱입니다. 나는 하루 종일 내 무릎에 그 것을 원하지 않을 것입니다! (즉, 그것은 UPS가 디렉토리가 존재 것을, 모니터링 / 연결 및 종료에 대해 구성된 경우)
그랜트

1
@Chipperyman “UPS는 벽면 콘센트와 컴퓨터 전원 소켓 사이를 연결하지 않습니까?” 예. 소비자 수준을 포함한 많은 UPS 설정을 통해 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가있는 하나의 노트북. 또한 루트 액세스가 필요하지 않습니다. 답변의 세 가지 방법 중 내 테스트에 따르면 이것이 가장 좋은 방법 일 수 있습니다.
Thomas Padron-McCarthy

이것은 나를 위해 작동합니다.
Lembik

이것은 내가 테스트 한 두 개의 데비안 랩톱에서는 작동하지 않았지만 다양한 다른 중요한 배포판에서 작업하기 위해 +1 했습니다.
John1024

배터리 이름이 BAT1이므로 나 (Toshiba Notebook)가 작동하지 않습니다. 가능한 다른 이름이 몇 개인 지 모르겠습니다.
Joe

@Joe 변경 BAT0BAT*-이 모든 변화를 감지합니다.
Alex

8

sudo를 사용하지 않으려면의 내용을 읽으십시오 /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 서브 샤시
  • 20 버스 확장 섀시
  • 21 주변 섀시
  • 22 스토리지 섀시
  • 23 랙 마운트 섀시
  • 24 밀폐형 PC

테이블 소스? 그리고 '점심 상자'는 농담입니까?!
OJFord

1
@OJFord 현재로서는 인용이 없습니다. '점심 상자'까지는 폼 팩터에 대한 별명입니다. 나는 전에 도시락 상자와 피자 상자 몇 개를 사용 해본 적이있다. 이 링크는 마지막 년, 당신은 매우 현대적인 도시락 컴퓨터를 볼 수 없습니다 수 있지만 theportablepc.com/portable-pc.html
기품을

1
: 그랜트의 대답은 마이크로 소프트에서 인용 포함 docs.microsoft.com/en-us/previous-versions/tn-archive/...
몸매

감사! 이제 나는 하나를 원한다. 그러나 나는 나의 지갑이 그렇지 않다고 생각한다.
OJFord

이것은 sudo 할 필요없이 나를 위해 일한 유일한 솔루션이었습니다. 배터리 기반 솔루션은 내 우분투 데스크탑이 랩톱이거나 내 데비안 랩톱이 데스크탑이라고 말했습니다.
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
}

수년간 데비안에서 이것을 사용해 왔습니다. 이것은 WSL 또는 virtualbox에서 실행되는 데비안에서도 작동합니다.

편집 : 더 많은 사례를 포착하기 위해이 스레드의 다른 답변에서 일반화되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.