スクリプトがラップトップまたはデスクトップで実行されているかどうかをプログラムで判断しますか?


18

ラップトップまたはデスクトップコンピューターで実行されている場合、bashスクリプト内から(プログラムで)判断する信頼できる方法はありますか?

私は明らかにユーザーにそれらを尋ねるように促すことができますが、それはかなり不格好です。


1
なぜあなたは知る必要があるのでしょうか?あなたは、バッテリ寿命を心配している
リッチHomolka

3
このスクリプトはユーザーのためにシステムのセットアップを行っており、その一部は、デバイスがラップトップの場合、いくつかの省電力設定を構成しています。
PseudoPsyche

回答:


29

システムにバッテリーがあるかどうかを確認することは信頼できません-システムに接続されたUPS(電源だけでなく、USB経由で自動シャットダウンとバッテリー監視にも)がバッテリーとして表示されることがあります。

しかし、素晴らしい信頼できる方法があります:

dmidecode --string chassis-type

ラップトップでは、これは「ラップトップ」、「ノートブック」、「ポータブル」、または「サブノートブック」のいずれかを返します(製造元がBIOSにコーディングしたものに応じて)。Windows 2000スクリプティングガイドの「コンピュータのシャーシタイプの識別」に可能な値の完全なリストがあります。MicrosoftTechNetページであるかどうかは心配しないでください。これはOS固有ではありません。

dmidecodeは、ハードウェアの製造元、システムのシリアル番号(場合によっては)などに関する情報も取得できます。


Network UPS Toolを使用して、自動シャットダウンとバッテリー監視のためにUSB経由でUPSを制御しています。デスクトップに「バッテリー」として表示されませ。UPSが表示される構成を使用しています/sys/module/batteryか?
John1024

これは/ sys / module / batteryメソッドよりもうまく機能します。2つのUbuntu 14.04デスクトップはそれぞれ「デスクトップ」と「ロープロファイルデスクトップ」に応答し、CentOS 6.5のデスクトップは「不明」と表示されます。CentOS 5.3のあるものは、キーワード「chassis-type」を認識しません。私が試したラップトップには「ノートブック」と書かれています。ただし、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 MintのUbuntu派生ディストリビューションが含まれています。

より一般的なソリューション

Debianシステムで動作しませんが、Alexが提案したソリューションは Ubuntu&CentOSで動作すると報告されています。したがって、一般性を高めるために、可能な組み合わせソリューションを提案します。

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

このアプローチにはroot特権は必要ありません。

詳細

実際のバッテリーを搭載したDebianシステムでは、/sys/module/batteryディレクトリに多くのファイルが含まれています。そのようなファイルの1つ/sys/module/battery/initstateに、テキストが含まれていますlive。ただし、Ubuntuでは、これらのファイルは実際のラップトップ上にも存在しません。したがって、このファイルの存在は、/sys/module/battery/initstateDebianを実行しているラップトップのテストに使用できるようです。

対照的に、私がテストしたDebianシステムでは、/proc/acpi/batteryディレクトリは存在しませんでした。


1
UPSを備えたデスクトップの場合、2番目のコマンドがまだtrueを返す可能性はありませんか?
PseudoPsyche

3
@PseudoPsyche UPSを搭載したデスクトップでテストしたところ、(ラップトップではなく)falseが返されました。
John1024

1
そこで最初に行うコマンドは何ですか?
AndreKR

1
どうやらUSB経由でAPC SmartUPSを接続した私の4U IBMサーバーはラップトップです。一日中ひざの上でそんなことをしたくないのは確かだ!(すなわち、それは、UPSがディレクトリが存在すること、監視/プラグインおよびシャットダウン用に設定されている場合)
グラント

1
@Chipperyman 「UPSは壁のコンセントとコンピューターの電源ソケットの間を行き来しませんか?」はい、そして消費者レベルを含む多くのUPSセットアップにより、USBケーブルを接続してデスクトップのバッテリー情報とアラートを取得できます。
JakeGould

8

コンピューターにバッテリーが取り付けられているかどうかを確認します。そして、以下はテストする1つの方法です。

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

この方法は、私が試した5台すべてのコンピューターで正しい答えを示しました。Ubuntu14.04の2つのデスクトップ、CentOS 5.3の1つのデスクトップ、CentOS 6.5の1つのデスクトップ、Ubuntu 14.04の1つのラップトップです。また、ルートアクセスは必要ありません。回答の3つの方法のうち、私のテストでは、これが暫定的に最良の方法である可能性があることを示しています。
トーマスパドロン-マッカーシー

これは私のために動作します。
レンビック

これは、私がテストした2台のDebianラップトップでは動作しませんでしたが、他のさまざまな重要なディストリビューションで動作するために+1しました。
John1024

私のバッテリーの名前はBAT1なので、私には使えません(東芝ノートブック)。他に考えられる名前がいくつあるかわかりません。
ジョー

@Joe変更BAT0BAT*-すべてのバリエーションを検出するはずです。
アレックス

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を必要とせずに私のために働いた唯一のソリューションでした。バッテリーベースのソリューションは、私の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でこれを何年も使用しています。これは、WSLまたはvirtualboxで実行されているDebianでも機能することに注意してください。

編集:より多くのケースをキャッチするために、このスレッドの他の回答から一般化。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.