Secara terprogram menentukan apakah skrip sedang dijalankan pada laptop atau desktop?

18

Apakah ada cara yang dapat diandalkan untuk menentukan (secara terprogram) dari dalam skrip bash jika dijalankan pada laptop atau komputer desktop?

Saya jelas bisa meminta pengguna untuk bertanya kepada mereka, tapi itu cukup kikuk.

PseudoPsyche
sumber
1
Saya akan mengatakan mengapa Anda perlu tahu? Apakah Anda khawatir tentang masa pakai baterai
Rich Homolka
3
Script sedang melakukan beberapa pengaturan sistem untuk pengguna, dan bagian dari itu adalah mengkonfigurasi beberapa pengaturan hemat daya jika perangkat adalah laptop.
PseudoPsyche

Jawaban:

29

Melihat apakah sistem memiliki baterai atau tidak dapat diandalkan - UPS terhubung ke sistem (tidak hanya untuk daya, tetapi juga melalui USB juga untuk shutdown otomatis dan pemantauan baterai) dapat muncul sebagai baterai.

Namun ada cara bagus yang dapat diandalkan:

dmidecode --string chassis-type

Pada laptop, ini akan mengembalikan salah satu dari "Laptop", "Notebook" "Portable", atau "Sub Notebook" (tergantung pada apa yang dikodekan pabrikan ke dalam BIOS). Ada daftar lengkap nilai yang mungkin di " Mengidentifikasi Jenis Chassis Komputer " di Windows 2000 Scripting Guide - jangan khawatir tentang itu menjadi halaman Microsoft TechNet, ini bukan OS spesifik.

dmidecode juga dapat memperoleh informasi tentang pabrik perangkat keras, nomor seri sistem (kadang-kadang), dll.

Hibah
sumber
Saya memiliki UPS yang dikendalikan melalui USB untuk shutdown otomatis dan pemantauan baterai dengan Network UPS Tool . Itu tidak muncul sebagai "baterai" di Desktop. Konfigurasi apa yang Anda gunakan di mana UPS muncul /sys/module/battery?
John1024
Ini berfungsi lebih baik daripada metode / sys / module / battery: Dua desktop Ubuntu 14.04 saya masing-masing menjawab "Desktop" dan "Desktop Profil Rendah", dan yang dengan CentOS 6.5 mengatakan "Tidak Dikenal". Yang dengan CentOS 5.3 tidak mengenali kata kunci "tipe sasis". Laptop yang saya coba mengatakan "Notebook". Tapi itu adalah kekurangan yang Anda butuhkan akses root.
Thomas Padron-McCarthy
Saya sangat suka jawaban ini!
Lembik
+1 untuk kemandirian distribusi. Saya mengujinya dengan sukses pada beberapa mesin. Satu-satunya mesin yang dmidecode memberikan jawaban yang kurang bermanfaat adalah netbook Aspire yang mengembalikan tipe sasis Other.
John1024
jawaban ini memerlukan sudo, jadi tidak layak untuk hal-hal seperti .bashrcfile. Meminta isi /sys/class/dmi/id/chassis_type, yang hanya satu nomor, jauh lebih baik (seperti yang ditunjukkan oleh jawaban lain di bawah).
xdavidliu
9

Solusi Debian:

Untuk mengetahui apakah mesin yang menjalankan Debian adalah laptop, coba:

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

Pendekatan ini tidak memerlukan roothak istimewa.

Namun pada distribusi lain, direktori ini tampaknya ada, setidaknya dalam bentuk kerangka, terlepas dari ada atau tidaknya baterai. Dari komentar (di bawah), distribusi ini termasuk CentOS, Ubuntu, dan distribusi Linux Mint yang diturunkan dari Ubuntu.

Solusi Lebih Umum

Meskipun tidak bekerja pada sistem Debian saya, solusi yang diusulkan oleh Alex dilaporkan bekerja di Ubuntu & CentOS. Dengan demikian menyarankan, untuk generalisasi yang lebih besar, kemungkinan solusi gabungan:

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

Pendekatan ini tidak memerlukan roothak istimewa.

Keterangan lebih lanjut

Pada sistem Debian dengan baterai yang sebenarnya, /sys/module/batterydirektori berisi banyak file. Salah satu file tersebut adalah /sys/module/battery/initstateyang berisi teks live. Namun pada Ubuntu, file-file ini tidak ada bahkan pada laptop sebenarnya. Dengan demikian, tampaknya keberadaan file /sys/module/battery/initstatedapat digunakan untuk menguji laptop yang menjalankan Debian.

Sebaliknya, pada sistem Debian yang saya uji, /proc/acpi/batterydirektori tersebut tidak ada.

John1024
sumber
1
Apakah tidak mungkin bahwa perintah kedua masih dapat mengembalikan true dalam kasus desktop dengan UPS?
PseudoPsyche
3
@ PseudoPsyche Saya baru saja mengujinya di desktop dengan UPS dan itu kembali palsu (bukan laptop).
John1024
1
Apa perintah pertama yang dilakukan di sana?
AndreKR
1
Rupanya server 4U IBM saya dengan APC SmartUPS yang terhubung melalui USB adalah laptop. Saya tentu tidak ingin benda itu ada di pangkuan saya sepanjang hari! (yaitu, jika memiliki UPS terhubung dan dikonfigurasi untuk shutdown / pemantauan, direktori itu akan ada)
Grant
1
@Chipperyman “Apakah UPS tidak masuk di antara soket dinding dan soket daya komputer?” Ya, dan banyak pengaturan UPS — termasuk level konsumen — memungkinkan Anda menghubungkan kabel USB untuk mendapatkan info baterai dan peringatan di desktop Anda.
JakeGould
8

Saya akan memeriksa apakah komputer memiliki baterai yang terpasang. Dan berikut ini adalah salah satu cara untuk menguji:

if [ -d /proc/acpi/battery/BAT* ]; then
  echo has a battery
fi
Alex
sumber
Metode ini memberikan jawaban yang benar pada semua lima komputer yang saya coba: dua desktop dengan Ubuntu 14.04, satu desktop dengan CentOS 5.3, satu desktop dengan CentOS 6.5, dan satu laptop dengan Ubuntu 14.04. Juga, itu tidak memerlukan akses root. Dari tiga metode dalam jawaban, tes saya menunjukkan bahwa ini mungkin, sementara, menjadi yang terbaik.
Thomas Padron-McCarthy
Ini bekerja untuk saya.
Lembik
Ini tidak berfungsi pada dua laptop Debian yang saya uji tetapi +1 untuk mengerjakan berbagai distribusi penting lainnya.
John1024
Tidak berfungsi untuk saya (Notebook Toshiba), karena baterai saya bernama BAT1. Saya tidak tahu berapa banyak nama lain yang mungkin ada.
Joe
@Suka Ubah BAT0ke BAT*- ini akan mendeteksi semua variasi.
Alex
8

Untuk menghindari penggunaan sudo, Anda dapat membaca konten /sys/class/dmi/id/chassis_type. Tampaknya sesuai dengan tabel berikut:

  • 1 lainnya
  • 2 Tidak Diketahui
  • 3 Desktop
  • 4 Desktop Profil Rendah
  • 5 Kotak Pizza
  • 6 Menara Mini
  • 7 Menara
  • 8 Portable
  • 9 Laptop
  • 10 Notebook
  • 11 Hand Held
  • 12 Stasiun Docking
  • 13 Semua dalam Satu
  • 14 Sub Notebook
  • 15 Menghemat Ruang
  • 16 Kotak Makan Siang
  • 17 Chassis Sistem Utama
  • 18 Chassis Ekspansi
  • 19 SubChassis
  • 20 Chassis Ekspansi Bus
  • 21 Chassis Periferal
  • 22 Chassis Penyimpanan
  • 23 Chassis Pemasangan Rak
  • 24 Sealed-Case PC
pendiam
sumber
Sumber untuk tabel? Dan apakah 'kotak makan siang' adalah lelucon ?!
OJFord
1
@ OJFord Saya tidak memiliki kutipan saat ini. Sejauh 'kotak makan', itu adalah nama panggilan yang diberikan ke faktor bentuk. Saya telah bekerja dengan beberapa kotak makan siang dan pizzabox sebelumnya. Meskipun tautan ini mungkin tidak bertahan bertahun-tahun, Anda dapat melihat beberapa komputer kotak makan siang yang sangat modern theportablepc.com/portable-pc.html
demure
1
Jawaban Grant berisi kutipan dari microsoft: docs.microsoft.com/en-us/previous-versions/tn-archive/...
sopan
Terima kasih! Sekarang saya ingin satu ... Tapi saya kira dompet saya tidak.
OJFord
Ini adalah satu-satunya solusi yang bekerja untuk saya tanpa perlu sudo. Solusi berbasis baterai baik mengatakan desktop ubuntu saya adalah laptop, atau mengatakan laptop debian saya adalah desktop.
xdavidliu
1

Jika memeriksa keberadaan baterai sudah cukup baik, Anda dapat menggunakan fungsi shell ini:

# 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
}

Telah menggunakan ini di Debian selama bertahun-tahun. Perhatikan ini berfungsi juga untuk Debian yang berjalan di WSL atau virtualbox.

Sunting: digeneralisasi dari jawaban lain di utas ini untuk menangkap lebih banyak kasus.

laur
sumber