หากฉันใช้หัวขาด Pi มีคำสั่งให้ฉันใช้เพื่อปิดเครื่องอย่างปลอดภัยหรือฉันควรถอดสายไฟออกหรือไม่?
poweroff
อาจเป็นลิงก์สัญลักษณ์ไปที่halt
... ! 8-)
หากฉันใช้หัวขาด Pi มีคำสั่งให้ฉันใช้เพื่อปิดเครื่องอย่างปลอดภัยหรือฉันควรถอดสายไฟออกหรือไม่?
poweroff
อาจเป็นลิงก์สัญลักษณ์ไปที่halt
... ! 8-)
คำตอบ:
คุณสามารถปิดการใช้ pi ได้อย่างปลอดภัย
shutdown -h now
-h เพียงหยุดกระบวนการทั้งหมด
sudo poweroff
-h
นี้จะหยุดทั้งระบบ - โดยไม่มีตัวเลือกshutdown
นั้นจะใช้init
ในการรันระดับ 1 - เช่นโหมดผู้ใช้คนเดียวกำลังรอการเข้าสู่ระบบของผู้ใช้ขั้นสูง (จำเป็นต้องใช้รหัสผ่านรูท) หลังจากเข้าสู่ระบบเป็นรากและจากนั้นออกจากระบบinit
แล้วจะทำซ้ำสิ่งที่จำเป็นเพื่อนำ RPI ขึ้นในโหมดผู้ใช้หลายคน - เท่าที่จะทำในช่วงเดิม boot-up (หลังจากเสร็จสิ้นทุกสิ่งคือfsck
ฯลฯ การทำงาน/etc/rc.local
ว่า ทำแล้ว) ในบริบทนี้ "ปิด" คือ "ใช้ระบบออฟไลน์สำหรับผู้ใช้ปกติ" ...
shutdown
ใช้เวลาจริงในการดำเนินการและยกเลิกการเชื่อมต่อไคลเอ็นต์ ssh ใด ๆ ในขณะที่ใช้งาน ดังนั้นคุณจะรู้ได้อย่างไรว่าปลอดภัยเช่นเมื่อถอดการ์ด SD?
อย่าถอดปลั๊กเพียงเพราะอาจทำให้ระบบไฟล์เสียหายได้ในบางครั้ง
ในฐานะที่เป็น 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
และที่จริงแล้วหน้าคนสำหรับคำสั่งทั้งหมดที่กล่าวถึงที่นี่;)
shutdown -h now
บน linux) อาจช่วยลดความต้องการเช่นนี้ได้)
คุณอาจออกคำสั่งต่อไปนี้เพื่อปิด:
sudo init 0
และเพื่อรีบูต:
sudo init 6
sudo telinit #
ที่ # คือตัวเลขระหว่าง 0 ถึง 6 - telinit เป็นลิงค์สัญลักษณ์เพื่อเริ่มต้นซึ่งตระหนักว่ามันไม่ได้ถูกเรียกด้วยชื่อหลัก "init" (และไม่มี PID ของ 1) เพื่อที่จะสร้างท่อจริง "init กระบวนการ" และบอกว่ามันจะเปลี่ยนระดับการทำงานในปัจจุบันเพื่อค่าใหม่ที่ระบุไว้เป็นอาร์กิวเมนต์ที่เป็นตัวเลข telinit
เป็นตัวย่อของ "tell init the runlevel ใหม่"
วิธีที่ฉันชอบคือการใช้sudo poweroff
ซึ่งเป็นนามแฝงสำหรับคำสั่งปิดที่ฆ่าการใช้พลังงาน
ในขณะที่คำถามได้รับคำตอบอย่างเพียงพอแล้ว การตั้งค่าของฉันแตกต่างจากที่ได้รับคำตอบแล้ว
อย่างที่คนอื่นพูดหลีกเลี่ยงเพียงแค่ดึงพลัง คำสั่งที่แนะนำของฉัน (ไม่ว่าจะเป็นรากหรือย่อหน้าที่มีsudo
):
หากต้องการหยุด: halt
(สำหรับเสียงหวีดหวือและคำสั่งนี้ก่อนหน้านี้ก็จะทำให้ระบบปิดสำหรับเจสซีมันไม่ได้จริงๆ poweroff แม้ว่ามันจะปลอดภัยที่จะดึงปลั๊กเมื่อเสร็จแล้ว) halt -p
; shutdown now -h
หรือเพียงแค่poweroff
ต้องการเจสซี ...
ในการรีบูต: reboot
ฉันชอบคำสั่งเหล่านี้เนื่องจากตรงไปตรงมาง่ายต่อการจดจำและชัดเจนในตัวเอง ...
halt
หรือpoweroff
เพราะมันเป็นเพียงนามแฝงของshutdown -h now
เครื่องมือ GNU แต่ในระบบอื่นคุณจะปิดระบบของคุณทันทีฆ่าโปรแกรมทั้งหมดของคุณและอาจทำให้ระบบไฟล์ของคุณเสียหาย สิ่งนี้กล่าวว่าคุณสามารถใช้กับ raspberry pi ที่มีการแจกแจงลินุกซ์ส่วนใหญ่ แต่ถ้าคุณใช้ pi สำหรับการเรียนรู้คุณอาจต้องการ "วิธีที่ถูกต้อง"
halt
, poweroff
, reboot
และshutdown
มี symlinks ทั้งหมดไปsystemctl
(ด้วยคำสั่งเดิมยังผ่าน) ว่าแล้วทริกเกอร์เป้าหมาย SystemD ที่เหมาะสม: poweroff.target
เช่น FWIW poweroff.target
ทริกเกอร์การเรียก ACPI เพื่อปิดระบบอย่างหมดจด ดังนั้น AFAIK ในยุคนี้poweroff
(หรือsystemctl poweroff
) คือ "วิธีที่ถูกต้อง" :)
--no-preserve-root
ธง อย่าพึ่งพา / bin / sh เป็น / bin / bash (สิ่งนี้ไม่เป็นความจริงสำหรับระบบที่ใช้เดเบียนอีกต่อไป) มักจะมีประโยชน์ในการลองใช้วิธี "ถูกต้อง" แม้ว่าในปัจจุบันจะสามารถใช้งานได้ในวิธีอื่น
/bin/bash
ต้องการทุบตีแล้วคุณควรใช้อย่างชัดเจน FYI มุมมองของฉันเป็นอย่างมาก Debian เป็นศูนย์กลาง ...
หากคุณต้องการเพิ่มฮาร์ดแวร์สักเล็กน้อยคุณสามารถเขียน daemon ขนาดเล็กเพื่อสำรวจพิน GPIO และยืนยันว่ามีพินเริ่มต้นใหม่ (หรือปิดระบบ) Pi
นอกจากนี้คำสั่งทั้งหมดที่กล่าวถึงในที่นี้สามารถเรียกใช้ผ่าน SSH ได้
ฉันรู้ว่ามันเป็น 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()
ฉันsshลงในกล่อง RPi ของฉันโดยใช้คำสั่ง
$ ssh rpi sudo poweroff
RPIเป็นนามแฝงสำหรับ IP Address ของกล่อง RPI ของฉันและถูกกำหนดไว้ใน~ / .ssh / configไฟล์