ตรวจสอบโดยทางโปรแกรมว่าสคริปต์จะถูกดำเนินการบนแล็ปท็อปหรือเดสก์ท็อป?


18

มีวิธีใดที่เชื่อถือได้ในการพิจารณา (โดยทางโปรแกรม) จากภายในสคริปต์ทุบตีถ้ามันถูกดำเนินการบนแล็ปท็อปหรือคอมพิวเตอร์เดสก์ท็อป?

เห็นได้ชัดว่าฉันเพียงแค่แจ้งให้ผู้ใช้ถามพวกเขา แต่นั่นเป็น clunky สวย


1
ฉันจะบอกว่าทำไมคุณต้องรู้ คุณเป็นกังวลเกี่ยวกับอายุการใช้งานแบตเตอรี่
Rich Homolka

3
สคริปต์กำลังทำการตั้งค่าระบบบางอย่างสำหรับผู้ใช้และส่วนหนึ่งของนั้นกำลังกำหนดการตั้งค่าการประหยัดพลังงานบางอย่างหากอุปกรณ์นั้นเป็นแล็ปท็อป
PseudoPsyche

คำตอบ:


29

ดูว่าระบบมีแบตเตอรี่ไม่น่าเชื่อถือหรือไม่ - UPS ที่เชื่อมต่อกับระบบ (ไม่เพียง แต่ใช้พลังงาน แต่ผ่านทาง USB เช่นกันสำหรับการปิดเครื่องอัตโนมัติและการตรวจสอบแบตเตอรี่) อาจปรากฏขึ้นเป็นแบตเตอรี่

มีวิธีที่น่าเชื่อถือดี แต่:

dmidecode --string chassis-type

ในแล็ปท็อปสิ่งนี้จะส่งคืนหนึ่งใน "แล็ปท็อป", "โน๊ตบุ๊ค" "พกพา" หรือ "โน๊ตบุ๊คย่อย" (ขึ้นอยู่กับสิ่งที่ผู้ผลิตกำหนดรหัสไว้ใน BIOS) มีรายการเต็มรูปแบบของค่าที่เป็นไปได้ที่ "การระบุประเภทแชสซีของคอมพิวเตอร์ " ในคู่มือการเขียนสคริปต์ Windows 2000 - ไม่ต้องกังวลว่าเป็นหน้า Microsoft TechNet นี่ไม่ใช่ระบบปฏิบัติการที่เฉพาะเจาะจง

dmidecode ยังสามารถรับข้อมูลเกี่ยวกับผู้ผลิตฮาร์ดแวร์หมายเลขซีเรียลของระบบ (บางครั้ง) เป็นต้น


ฉันมียูพีเอสควบคุมผ่านทาง USB สำหรับการปิดเครื่องอัตโนมัติและการตรวจสอบแบตเตอรี่ที่มีเครื่องมือ UPS เครือข่าย มันไม่ปรากฏเป็น "แบตเตอรี่" บนเดสก์ท็อป สิ่งที่คุณตั้งค่าโดยใช้ว่าตามที่ปรากฏใน UPS /sys/module/battery?
John1024

วิธีนี้ใช้งานได้ดีกว่า / sys / module / battery วิธี: Ubuntu 14.04 เดสก์ท็อปของฉันตอบ "เดสก์ท็อป" และ "เดสก์ท็อปโปรไฟล์ต่ำ" ตามลำดับและหนึ่งใน CentOS 6.5 บอกว่า "ไม่รู้จัก" รายการที่มี CentOS 5.3 ไม่รู้จักคำหลัก "ประเภทแชสซี" แล็ปท็อปที่ฉันลองใช้ในข้อความว่า "Notebook" แต่มันเป็นข้อเสียเปรียบที่คุณต้องการเข้าถึงรูต
Thomas Padron-McCarthy

ฉันชอบคำตอบนี้จริงๆ!
Lembik

+1 สำหรับการกระจายความเป็นอิสระ ฉันทดสอบมันสำเร็จในหลาย ๆ เครื่อง เครื่องเท่านั้นที่ dmidecode ให้น้อยกว่าคำตอบที่เป็นประโยชน์เป็นเน็ตบุ๊ก Aspire Otherกลับประเภทตัวถังของ
John1024

คำตอบนี้ต้องใช้ sudo ดังนั้นจึงไม่สามารถใช้กับสิ่งต่าง ๆ เช่น.bashrcไฟล์ได้ การค้นหาเนื้อหาของ/sys/class/dmi/id/chassis_typeซึ่งเป็นเพียงตัวเลขเดียวจะดีกว่ามาก (ดังที่คำตอบด้านล่างชี้ให้เห็น)
xdavidliu

9

โซลูชันเดเบียน:

หากต้องการค้นหาว่าเครื่องที่ใช้ Debian เป็นแล็ปท็อปหรือไม่ลอง:

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

วิธีการนี้ไม่ต้องการrootสิทธิ์พิเศษ

อย่างไรก็ตามในดิสทริบิวชันอื่น ๆ ไดเรกทอรีนี้ดูเหมือนจะมีอยู่อย่างน้อยในรูปแบบโครงกระดูกโดยไม่คำนึงว่ามีแบตเตอรี่อยู่หรือไม่ จากความคิดเห็น (ด้านล่าง) การแจกแจงเหล่านี้รวมถึง CentOS, Ubuntu และการกระจาย Linux ที่ได้รับจาก Ubuntu ของ Linux Mint

โซลูชันทั่วไปเพิ่มเติม

แม้ว่ามันจะไม่ทำงานบนระบบ 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ไดเร็กทอรีมีไฟล์จำนวนมาก หนึ่งไฟล์ดังกล่าวเป็นที่มีข้อความ/sys/module/battery/initstate liveอย่างไรก็ตามใน Ubuntu ไฟล์เหล่านี้ไม่มีอยู่ในแล็ปท็อปจริง ดังนั้นจึงปรากฏว่ามีไฟล์อยู่/sys/module/battery/initstateสามารถใช้ทดสอบแล็ปท็อปที่ใช้ Debian

บนระบบเดเบียนที่ฉันทดสอบในทางตรงกันข้าม/proc/acpi/batteryไดเรกทอรีไม่มีอยู่


1
เป็นไปไม่ได้ที่คำสั่งที่สองจะยังคงกลับมาจริงในกรณีของเดสก์ท็อปกับ UPS หรือไม่
PseudoPsyche

3
@PeudoPsyche ฉันเพิ่งทดสอบบนเดสก์ท็อปกับ UPS และส่งคืนเท็จ (ไม่ใช่แล็ปท็อป)
John1024

1
คำสั่งแรกที่ทำที่นั่นคืออะไร?
AndreKR

1
เห็นได้ชัดว่าเซิร์ฟเวอร์ 4U IBM ของฉันที่ใช้ APC SmartUPS ที่เสียบเข้ากับ USB เป็นแล็ปท็อป แน่นอนว่าฉันไม่ต้องการสิ่งนั้นบนตักของฉันทั้งวัน! (กล่าวคือหากมีการเสียบปลั๊ก 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

สิ่งนี้ไม่ได้ทำงานกับแล็ปท็อป Debian สองเครื่องที่ฉันทดสอบ แต่+1สำหรับการทำงานกับการแจกแจงที่สำคัญอื่น ๆ อีกมากมาย
John1024

ใช้งานไม่ได้สำหรับฉัน (โน้ตบุ๊คโตชิบา) เพราะแบตเตอรี่ของฉันชื่อ BAT1 ฉันไม่ทราบว่าอาจมีชื่ออื่นอีกกี่ชื่อ
โจ

@Joe Change BAT0to BAT*- ควรตรวจจับการเปลี่ยนแปลงทั้งหมด
อเล็กซ์

8

หลีกเลี่ยงการใช้ sudo /sys/class/dmi/id/chassis_typeคุณสามารถอ่านเนื้อหาของ มันจะปรากฏสอดคล้องกับตารางต่อไปนี้:

  • 1 อื่น ๆ
  • 2 ไม่ทราบ
  • 3 เดสก์ท็อป
  • 4 เดสก์ท็อปโปรไฟล์ต่ำ
  • 5 กล่องพิซซ่า
  • 6 มินิทาวเวอร์
  • 7 ทาวเวอร์
  • 8 แบบพกพา
  • 9 แล็ปท็อป
  • 10 โน๊ตบุ๊ค
  • 11 มือถือ
  • 12 Docking Station
  • 13 ทั้งหมดในที่เดียว
  • 14 โน๊ตบุ๊คย่อย
  • 15 ประหยัดพื้นที่
  • กล่องอาหารกลางวัน 16
  • 17 แชสซีของระบบหลัก
  • 18 แชสซีต่อขยาย
  • 19 แชสซีย่อย
  • แชสซีขยายบัส 20 ตัว
  • 21 อุปกรณ์ต่อพ่วง
  • 22 แชสซีจัดเก็บ
  • 23 Rack Mount Chassis
  • พีซีที่ปิดผนึก 24 ตัว

แหล่งที่มาสำหรับตารางหรือไม่ และ 'กล่องอาหารกลางวัน' เป็นเรื่องตลกหรือไม่!
OJFord

1
@OJFord ฉันไม่ได้รับการอ้างอิงในขณะนี้ เท่าที่ 'กล่องอาหารกลางวัน' มันเป็นชื่อเล่นให้กับฟอร์มแฟคเตอร์ ฉันเคยทำงานกับกล่องอาหารกลางวันและพิซซ่าก่อนหน้านี้สองสามครั้งก่อนหน้านี้ ในขณะที่การเชื่อมโยงนี้อาจจะไม่ปีที่ผ่านมาคุณจะเห็นกล่องอาหารกลางวันคอมพิวเตอร์บางทันสมัยมากtheportablepc.com/portable-pc.html
เอียงอาย

1
คำตอบของแกรนท์มีการอ้างอิงจาก Microsoft: 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
}

มีการใช้สิ่งนี้ใน Debian มานานหลายปี โปรดทราบว่าวิธีนี้ใช้ได้สำหรับ Debian ที่ทำงานใน WSL หรือกล่องเสมือน

แก้ไข: สรุปจากคำตอบอื่น ๆ ในชุดข้อความนี้เพื่อจับรายกรณีเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.