วิธีการปิด RPi เมื่อใช้งานหัวขาด


33

หากฉันใช้หัวขาด Pi มีคำสั่งให้ฉันใช้เพื่อปิดเครื่องอย่างปลอดภัยหรือฉันควรถอดสายไฟออกหรือไม่?


poweroff เป็นวิธีที่ดีที่สุดในการปิดเครื่อง
RahulAN

poweroffอาจเป็นลิงก์สัญลักษณ์ไปที่halt... ! 8-)
SlySven

คำตอบ:


40

คุณสามารถปิดการใช้ pi ได้อย่างปลอดภัย

shutdown -h now

-h เพียงหยุดกระบวนการทั้งหมด


7
อาจคุ้มค่าที่จะเรียนรู้ในเวลาเดียวกันกับที่ -r จะทำการรีสตาร์ท (ปิดเครื่อง + รีบูต)
XTL

6
อย่าลืมว่าคุณต้องรูทถึงการปิดเครื่องหรือใช้ sudo
keiki

1
หรือsudo poweroff
berto

3
สิ่ง-hนี้จะหยุดทั้งระบบ - โดยไม่มีตัวเลือกshutdownนั้นจะใช้initในการรันระดับ 1 - เช่นโหมดผู้ใช้คนเดียวกำลังรอการเข้าสู่ระบบของผู้ใช้ขั้นสูง (จำเป็นต้องใช้รหัสผ่านรูท) หลังจากเข้าสู่ระบบเป็นรากและจากนั้นออกจากระบบinitแล้วจะทำซ้ำสิ่งที่จำเป็นเพื่อนำ RPI ขึ้นในโหมดผู้ใช้หลายคน - เท่าที่จะทำในช่วงเดิม boot-up (หลังจากเสร็จสิ้นทุกสิ่งคือfsckฯลฯ การทำงาน/etc/rc.localว่า ทำแล้ว) ในบริบทนี้ "ปิด" คือ "ใช้ระบบออฟไลน์สำหรับผู้ใช้ปกติ" ...
SlySven

ใช่ แต่shutdownใช้เวลาจริงในการดำเนินการและยกเลิกการเชื่อมต่อไคลเอ็นต์ ssh ใด ๆ ในขณะที่ใช้งาน ดังนั้นคุณจะรู้ได้อย่างไรว่าปลอดภัยเช่นเมื่อถอดการ์ด SD?
Tom Auger

40

อย่าถอดปลั๊กเพียงเพราะอาจทำให้ระบบไฟล์เสียหายได้ในบางครั้ง

ในฐานะที่เป็น Impluss shutdownกล่าวว่าการใช้งาน ฉันเพิ่งวิ่งข้ามเคล็ดลับเกี่ยวกับการกำหนดค่า udev เพื่อทริกเกอร์การปิดเครื่องหรือรีบูตเมื่อถอดปลั๊กอุปกรณ์ usb ที่ระบุ สิ่งนี้มีประโยชน์หากระบบไม่ตอบสนองหรือสูญเสียการเชื่อมต่อเครือข่ายและคุณไม่สามารถหรือไม่ต้องกังวลกับการเสียบอุปกรณ์ hid (อุปกรณ์อินเทอร์เฟซของมนุษย์) เช่นแป้นพิมพ์ลงไป

มีดีอาจล้าสมัยเล็กน้อย แต่เขียนดีแนะนำกฎ udev | ที่นี่ | . แนวคิดพื้นฐานคือคุณจะได้รับข้อมูลเกี่ยวกับอุปกรณ์ผ่านlsusbตัวอย่างเช่น:

Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN

IDฟิลด์ที่สามที่มีป้ายกำกับคือผู้ขายและรหัสรุ่นคั่นด้วยเครื่องหมายโคลอน สมมติว่าคุณไม่มีอุปกรณ์ที่เหมือนกันหลายตัวที่เสียบเข้าด้วยกันชุดนี้ควรจะไม่ซ้ำกัน

คุณสามารถรับรายละเอียดข้อมูลที่เกี่ยวข้องเพิ่มเติมผ่านทางudevadm monitor --udev --propertyซึ่งจะรายงานไปยังมาตรฐานจนกว่าคุณจะฆ่ามันเช่น เมื่อฉันถอดปลั๊กดองเกิล weenie wifi dongle จากด้านบนมันคาย:

UDEV  [2834.504860] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
ACTION=remove
[...]
ID_BUS=usb
ID_MODEL=802.11n_WLAN_Adapter
ID_MODEL_ENC=802.11n\x20WLAN\x20Adapter
ID_MODEL_ID=8176
[...]
ID_VENDOR=Realtek
ID_VENDOR_ENC=Realtek
ID_VENDOR_ID=0bda

สังเกตเห็นฟิลด์ ID_MODEL และ ID_VENDOR นี่คือสิ่งที่คุณต้องการใช้ในกฎ udev ของคุณ มีบางแหล่งที่ล้าสมัยหรือไม่ถูกต้องออนไลน์ที่แนะนำให้ใช้ฟิลด์ ATTR แต่ฟิลด์เหล่านี้เป็นฟิลด์ ENV สำหรับเหตุการณ์ "ลบ"

/etc/udev/rules.dสร้างไฟล์ใน นี่คือสิ่งเดียวกันโดยไม่คำนึงถึงการกระจาย ไฟล์จะต้องลงท้ายด้วย.rulesและไฟล์ทั้งหมดในไดเรกทอรีนี้จะถูกประมวลผลคำศัพท์ ฉันเชื่อว่ากฎที่ประกาศก่อนหน้านี้มีความสำคัญดังนั้นการใช้00-my_pi.rulesจะเก็บไว้ที่ด้านหน้าของบรรทัด (เรียงลำดับตัวเลขก่อนตัวอักษร) ในนั้นเพิ่มบรรทัดเช่น:

ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"

ระวังและไม่ได้== =หากคุณใช้ในภายหลังเกณฑ์จะไม่มีความหมาย ในกรณีนี้คุณสามารถลงเอยด้วยกฎ udev ที่ตรงกับเหตุการณ์ใด ๆ !

udevadm control --reload-rulesตรวจสอบให้แน่ใจว่านี้จะเต็มไปด้วย ตอนนี้เมื่อคุณดึงสัญญาณ wifi ของดองเกิลออก pi ควรปิดเครื่องให้สะอาด ... ใช้เวลาหนึ่งนาทีในการทำเช่นนั้นและคุณสามารถถอดปลั๊กไฟได้ (ลองทำสิ่งนี้ด้วยหน้าจอที่แนบมาในครั้งแรก) คุณสามารถใช้สิ่งนี้เพื่อรีบูต - ดูman shutdownและที่จริงแล้วหน้าคนสำหรับคำสั่งทั้งหมดที่กล่าวถึงที่นี่;)


3
ฉันไม่คิดว่านี่คือสิ่งที่ OP ขอมา แต่ +1 สำหรับข้อมูล
Vincent P

เรียบร้อย! แน่นอนคุณควรจะสามารถลบ (หรือเสียบ) ของอุปกรณ์ USB โดยพลการเรียกสิ่งนี้
Tobias Kienzler

เป็นการเริ่มต้นที่ดี การปิดการทำงานจะเกิดขึ้นโดยปุ่ม GPIO (วิธีใดก็ตามที่จะทำให้เกิดเหตุการณ์เช่นนี้ไปยัง ACPI หรือ HID) หรือบางสิ่งจะมีประโยชน์มากกว่า
XTL

@XTL: มี apci daemons อยู่รอบตัวดังนั้นจึงเป็นไปได้ (เคอร์เนลรายงานผ่าน proc ฯลฯ ) อย่างน้อยก็อาจเป็นจริงสำหรับ gpio บน pi เหตุการณ์ HID เป็นบริบทมากขึ้น (บริบทตัวอย่างเป็นสภาพแวดล้อม GUI บนเดสก์ท็อป) และความจริงที่ว่าคุณสามารถพิมพ์ "halt" (== shutdown -h nowบน linux) อาจช่วยลดความต้องการเช่นนี้ได้)
goldilocks

นี่เป็นสิ่งที่สมบูรณ์แบบดองเกิลเป็นสิ่งเดียวที่เสียบเข้ากับ Pi ของเราและเรามักจะสูญเสียการเชื่อมต่อดังนั้นเราจึงต้องย้ายมันไปรอบ ๆ โดยไม่ทำลายมันจากการสูญเสียพลังงาน
noio

8

คุณอาจออกคำสั่งต่อไปนี้เพื่อปิด:

sudo init 0

และเพื่อรีบูต:

sudo init 6

สิ่งนี้ขึ้นอยู่กับระดับการรันเป็นแนวคิดที่ระบบปฏิบัติการยังคงใช้อยู่ การเปลี่ยนไปใช้ systemd ทำให้สิ่งนี้ใช้งานได้น้อยลงในปัจจุบัน
สตีเฟ่น Michael Kellat

หากไม่รวมการแก้ไขตั้งแต่วันนี้คุณอาจสังเกตว่านี่เป็นคำตอบที่ค่อนข้างเก่า คำถามนี้อายุมากกว่าสองปีด้วย
สมาชิกที่ลงทะเบียน

1
ในการใช้งานนี้จะถือว่าดีกว่าที่จะใช้โดยsudo telinit #ที่ # คือตัวเลขระหว่าง 0 ถึง 6 - telinit เป็นลิงค์สัญลักษณ์เพื่อเริ่มต้นซึ่งตระหนักว่ามันไม่ได้ถูกเรียกด้วยชื่อหลัก "init" (และไม่มี PID ของ 1) เพื่อที่จะสร้างท่อจริง "init กระบวนการ" และบอกว่ามันจะเปลี่ยนระดับการทำงานในปัจจุบันเพื่อค่าใหม่ที่ระบุไว้เป็นอาร์กิวเมนต์ที่เป็นตัวเลข telinitเป็นตัวย่อของ "tell init the runlevel ใหม่"
SlySven

7

วิธีที่ฉันชอบคือการใช้sudo poweroffซึ่งเป็นนามแฝงสำหรับคำสั่งปิดที่ฆ่าการใช้พลังงาน


7

ในขณะที่คำถามได้รับคำตอบอย่างเพียงพอแล้ว การตั้งค่าของฉันแตกต่างจากที่ได้รับคำตอบแล้ว

อย่างที่คนอื่นพูดหลีกเลี่ยงเพียงแค่ดึงพลัง คำสั่งที่แนะนำของฉัน (ไม่ว่าจะเป็นรากหรือย่อหน้าที่มีsudo):

หากต้องการหยุด: halt(สำหรับเสียงหวีดหวือและคำสั่งนี้ก่อนหน้านี้ก็จะทำให้ระบบปิดสำหรับเจสซีมันไม่ได้จริงๆ poweroff แม้ว่ามันจะปลอดภัยที่จะดึงปลั๊กเมื่อเสร็จแล้ว) halt -p; shutdown now -hหรือเพียงแค่poweroffต้องการเจสซี ...

ในการรีบูต: reboot

ฉันชอบคำสั่งเหล่านี้เนื่องจากตรงไปตรงมาง่ายต่อการจดจำและชัดเจนในตัวเอง ...


ไม่ได้หมายความว่าจะโวยวาย แต่ฉันคิดว่ามันรุนแรงเล็กน้อยที่คำตอบของฉัน (จาก 8 เดือนที่ผ่านมา) ถูกลดระดับลงเพราะ Debian (เช่น upstream of Raspbian) เปลี่ยนวิธีการทำงานของคำสั่งของพวกเขา . คำตอบของฉัน (ก่อนที่จะแก้ไข) ยังตอบ OP (เช่นถ้าคุณหยุดระบบจะปลอดภัยในการดึงปลั๊ก ... ) FWIW ฉันได้อัปเดตคำตอบแล้วดังนั้นจึงเป็นที่ชัดเจนว่านี่ไม่ทำงานอีกต่อไปเนื่องจากผู้ใช้อาจ หวังว่า ...
เจเรมีเดวิส

คุณไม่ควรใช้นิสัยhaltหรือpoweroffเพราะมันเป็นเพียงนามแฝงของshutdown -h nowเครื่องมือ GNU แต่ในระบบอื่นคุณจะปิดระบบของคุณทันทีฆ่าโปรแกรมทั้งหมดของคุณและอาจทำให้ระบบไฟล์ของคุณเสียหาย สิ่งนี้กล่าวว่าคุณสามารถใช้กับ raspberry pi ที่มีการแจกแจงลินุกซ์ส่วนใหญ่ แต่ถ้าคุณใช้ pi สำหรับการเรียนรู้คุณอาจต้องการ "วิธีที่ถูกต้อง"
อัลโล

@allo - คุณอาจถูกต้องสำหรับ Linux OS รุ่นเก่าและรุ่นอื่น ๆ ที่ไม่ใช่ Linux Unix เช่น OS (เช่น BSD) แต่ใน Linux OS ล่าสุดที่ใช้ SystemD (เช่น Linux ส่วนใหญ่ในปัจจุบัน) ที่ไม่เป็นเช่นนั้น halt, poweroff, rebootและshutdownมี symlinks ทั้งหมดไปsystemctl(ด้วยคำสั่งเดิมยังผ่าน) ว่าแล้วทริกเกอร์เป้าหมาย SystemD ที่เหมาะสม: poweroff.targetเช่น FWIW poweroff.targetทริกเกอร์การเรียก ACPI เพื่อปิดระบบอย่างหมดจด ดังนั้น AFAIK ในยุคนี้poweroff(หรือsystemctl poweroff) คือ "วิธีที่ถูกต้อง" :)
Jeremy Davis

เช่นเดียวกับหลาย ๆ กรณีที่มี linux มีมากกว่าหนึ่งวิธี แต่คุณควรพิจารณาว่าคุณไม่ต้องการเรียนรู้วิธีการดังกล่าวซึ่งอธิบายไว้ในมาตรฐานซึ่งตามด้วยระบบยูนิกซ์อื่นเช่นกัน มีประโยชน์เล็กน้อยสำหรับคุณในฐานะผู้ใช้ linux แต่ใครจะรู้เมื่อคุณจะลองใช้ระบบอื่นในอนาคต อย่าวางใจหยุดชะงักและอย่าพึ่งพา rm ที่จะมี--no-preserve-rootธง อย่าพึ่งพา / bin / sh เป็น / bin / bash (สิ่งนี้ไม่เป็นความจริงสำหรับระบบที่ใช้เดเบียนอีกต่อไป) มักจะมีประโยชน์ในการลองใช้วิธี "ถูกต้อง" แม้ว่าในปัจจุบันจะสามารถใช้งานได้ในวิธีอื่น
อัลโล

1
@allo - คะแนนที่ยุติธรรมและฉันคิดว่ามันยอดเยี่ยมมากสำหรับคุณที่จะแบ่งปันความรู้เกี่ยวกับระบบที่แตกต่างกันและฉันยอมรับว่ามันคุ้มค่าที่จะสังเกตเห็นความแตกต่างระหว่างระบบและข้อ จำกัด ที่เกี่ยวข้อง แม้ว่าฉันจะไม่เห็นด้วยกับข้อเสนอแนะของคุณว่าวิธีการของคุณเป็นวิธีที่ "ถูกต้อง" อาจเป็นวิธีที่ "เข้ากันได้กับ posix" แต่ก็ไม่ได้ทำให้ "ถูกต้อง" และ "ผิด" อีกวิธีหนึ่ง เช่นใช้ทุบตี (และ bashisms) ถูกต้องตามกฎหมายโดยสิ้นเชิง IMO แต่ผมยอมรับว่าหากคุณต้องการ / /bin/bashต้องการทุบตีแล้วคุณควรใช้อย่างชัดเจน FYI มุมมองของฉันเป็นอย่างมาก Debian เป็นศูนย์กลาง ...
เจเรมีเดวิส

4

หากคุณต้องการเพิ่มฮาร์ดแวร์สักเล็กน้อยคุณสามารถเขียน daemon ขนาดเล็กเพื่อสำรวจพิน GPIO และยืนยันว่ามีพินเริ่มต้นใหม่ (หรือปิดระบบ) Pi

นอกจากนี้คำสั่งทั้งหมดที่กล่าวถึงในที่นี้สามารถเรียกใช้ผ่าน SSH ได้


3

ฉันรู้ว่ามันเป็น 3 ปีหลังจากคำถามเดิม แต่ฉันเพิ่งได้ Raspberry Pi ของฉันและฉันมีปัญหาในการปิดถ้าฉันลืมที่จะเชื่อมต่อกับหน้าจอมอนิเตอร์และมันไม่มีการเชื่อมต่อเครือข่ายใด ๆ

ฉันได้เขียนสคริปต์ Python ขนาดเล็กเพื่อปิดโดยอัตโนมัติภายใน 60 วินาทีโดยการเสียบ thumbdrive ที่มีไฟล์ชื่อ "pi_auto_shutdown"

เพียงเรียกสคริปต์นี้จาก rc.local

ฉันหวังว่านี่จะช่วยได้.

shutdown_loop_delay = 60
shutdown_flag_file = 'pi_auto_shutdown'

def poll_shutdown_flag():
    """check whether a shutdown flag file in a usb drive exists"""

    ## run mount command
    ## sample mount output: "/dev/sda1 on /media/path/"
    output, error = subprocess.Popen('mount', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    if len(error) > 0:
        log('mount error: {}'.format(error))
        return False

    ## parse mount output
    for output_line in output.split('\n'):
        output_words = output_line.split(' ')

        if len(output_words) < 3:
            continue

        if output_words[0].startswith('/dev/sd'):
            flag_file_path = os.path.join(output_words[2], shutdown_flag_file)
            if os.path.isfile(flag_file_path):
                return True

    return False

def shutdown():
    """shutdown the system immediately"""
    subprocess.Popen('sudo shutdown -h now', shell=True).communicate()

def loop_shutdown():
    while True:
        time.sleep(shutdown_loop_delay)
        if poll_shutdown_flag():
            shutdown()

loop_shutdown()

แนวทางที่น่าสนใจ
Eric Wilson

1

ฉันsshลงในกล่อง RPi ของฉันโดยใช้คำสั่ง

$ ssh rpi sudo poweroff

RPIเป็นนามแฝงสำหรับ IP Address ของกล่อง RPI ของฉันและถูกกำหนดไว้ใน~ / .ssh / configไฟล์

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