อะไรคือความแตกต่างระหว่างคำสั่งเหล่านี้เพื่อนำเซิร์ฟเวอร์ Linux ลงมา?


65

การอ่าน"คำสั่ง Halt และ Shutdown แตกต่างกันอย่างไร" โดยทั่วไปฉันมีความคิดว่าการปิดคำสั่งทำอะไรโดยมีหรือไม่มีตัวเลือก -h / -r

คำสั่ง "halt" จะทำการปิดระบบเพื่อให้ทำงานในระดับ 0 ของระบบ

คำสั่ง "shutdown" ดำเนินการปิดระบบเพื่อรันระดับ 1 โดยไม่มีคำสั่ง -h หรือ -r

สิ่งที่เกี่ยวกับคำสั่ง "poweroff" มันจะเข้าสู่ระดับ run-0 หรือ 1? นี่เป็นข้อแตกต่างหลักระหว่างคำสั่งทั้งสามนี้เท่านั้นหรือ


เกี่ยวข้องaskubuntu.com/q/578144/216503
heemayl

นี่คือบางสิ่งที่แตกต่างกันอย่างมากสำหรับ Solaris และ FreeBSD (โดยปกติแล้วพวกเขา (เกือบจะ) หยุด / ปิดเซิร์ฟเวอร์ทันทีโดยไม่เปลี่ยน runlevels เพื่อปิดสิ่งต่างๆก่อน)
Gert van den Berg

คำตอบ:


120

และตอนนี้ systemd ตอบ

คุณกำลังใช้ Red Hat Enterprise Linux ต่อแท็กในคำถามของคุณ ตั้งแต่เวอร์ชัน 7 ที่ใช้ systemd ไม่มีคำตอบอื่นใดที่ถูกต้องสำหรับโลกของ systemd; หรือแม้แต่บางข้อสมมติในคำถามของคุณ

  • ลืมเรื่อง runlevels ; มีอยู่ แต่เป็นเพียงความเข้ากันได้เท่านั้น เอกสาร systemd ระบุว่าแนวคิดนั้น "ล้าสมัย" หากคุณเริ่มเรียนรู้สิ่งนี้ในระบบปฏิบัติการ systemd อย่าเริ่มต้นที่นั่น
  • ลืมหน้าคู่มือที่อ้างอิงไปยัง marcelm; มันไม่ได้มาจากชุดเครื่องมือที่เหมาะสมเลยและเป็นคำอธิบายของคำสั่งของชุดเครื่องมืออื่นซึ่งไม่ถูกต้องสำหรับ systemd's มันเป็นhaltคำสั่งสำหรับinitยูทิลิตี้ จาก van Smoorenburg "System 5"
  • ละเว้นข้อความที่/sbin/haltเป็นลิงก์สัญลักษณ์ไปที่/sbin/reboot; นั่นไม่เป็นความจริงกับ systemd ไม่มีrebootโปรแกรมแยกต่างหากเลย
  • ละเว้นคำสั่งที่haltหรือrebootเรียกใช้shutdownโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่ง พวกเขายังไม่เป็นความจริงกับ systemd ไม่มีshutdownโปรแกรมแยกต่างหากเลย

ชุดเครื่องมือการจัดการทุกระบบมียูทิลิตี้เวอร์ชันเหล่านี้ systemd, พุ่งพรวดNoshรถตู้ Smoorenburg initและ BSD initทุกคนมีของตัวเองhalt, poweroffและอื่น ๆ ในแต่ละกลศาสตร์ของพวกเขาจะแตกต่างกันเล็กน้อย ดังนั้นหน้าคู่มือของพวกเขา

ในชุดเครื่องมือ systemd halt, poweroff,reboot , telinitและshutdownมีทั้งหมด/bin/systemctlเชื่อมโยงสัญลักษณ์ พวกเขามีทุก shims หลังเข้ากันได้ว่าเป็นเพียง shorthands สำหรับการเรียกติดต่อบรรทัดคำสั่งหลักของ systemctlsystemd: พวกเขาทั้งหมดแมปไป (และในความเป็นจริง) โปรแกรมเดียวที่เหมือนกัน (ตามแบบแผนเชลล์จะบอกว่าชื่อนั้นถูกเรียกใช้โดย)

เป้าหมายไม่ใช่ runlevels

ส่วนใหญ่ของคำสั่งเหล่านี้จะ shorthands บอก systemd ใช้systemctlเพื่อแยกเฉพาะเป้าหมาย การแยกได้อธิบายไว้ในsystemctlหน้าคู่มือ (qv) แต่อาจเป็นไปได้สำหรับจุดประสงค์ของคำตอบนี้ให้คิดว่าเป็นการเริ่มต้นเป้าหมายและหยุดผู้อื่น เป้าหมายมาตรฐานที่ใช้ใน systemd แสดงอยู่ในsystemd.specialหน้าคู่มือ (8)

ไดอะแกรมบนbootupหน้าคู่มือ (7) ในชุดเครื่องมือ systemd โดยเฉพาะอย่างยิ่งหนึ่งล่าสุดแสดงให้เห็นว่ามีเป้าหมาย "สุดท้าย" สามประการที่เกี่ยวข้องที่นี่:

  • halt.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_HALT_SYSTEM)ระบบ เคอร์เนลจะพยายามเข้าสู่โปรแกรมตรวจสอบ ROM หรือเพียงแค่หยุด CPU (ใช้กลไกใดก็ได้ที่เหมาะสมสำหรับการทำเช่นนั้น)
  • reboot.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_AUTOBOOT)ระบบ (หรือเทียบเท่ากับสายคำสั่งเวทมนต์) เคอร์เนลจะพยายามเรียกการรีบูต
  • poweroff.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_POWER_OFF)ระบบ เคอร์เนลจะพยายามลบพลังงานออกจากระบบหากเป็นไปได้

สิ่งเหล่านี้เป็นสิ่งที่คุณควรคำนึงถึงในฐานะระบบสุดท้ายไม่ใช่ระดับที่ใช้ ขอให้สังเกตจากแผนภาพว่าระบบเป้าหมาย systemd นั้นเข้ารหัสสิ่งที่อยู่ในระบบอื่นโดยปริยายมากกว่าชัดเจน: เช่นความคิดที่ว่าเป้าหมายสุดท้ายเหล่านี้รวมshutdown.targetเป้าหมายไว้แล้วดังนั้นจึงอธิบายบริการที่ต้องหยุดก่อนปิด พวกเขามีความขัดแย้งกับshutdown.targetเป้าหมาย

systemctlพยายามส่งคำขอไปยังsystemd-logindผู้ใช้ที่โทรหาไม่ใช่ผู้ใช้ขั้นสูง systemd-shutdowndนอกจากนี้ยังผ่านการปิดล่าช้าไป และบางชวเลขทำให้เกิดการwallแจ้งเตือน ความซับซ้อนเหล่านั้นซึ่งจะทำให้คำตอบนี้ยาวขึ้นหลายเท่าโดยสมมติว่าคุณเป็นผู้ใช้ขั้นสูงและไม่ได้ร้องขอการกระทำตามกำหนดเวลา:

  • systemctl isolate halt.target มีชวเลข:
    • shutdown -H now
    • systemctl halt
    • ไม่มีเครื่องตกแต่ง halt
  • systemctl isolate reboot.target มีชวเลข:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • ไม่มีเครื่องตกแต่ง reboot
  • systemctl isolate poweroff.target มีชวเลข:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • ไม่มีเครื่องตกแต่ง poweroff
  • systemctl isolate rescue.target มีชวเลข:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target มีชวเลข:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target มีชวเลข:
    • telinit 5

หลังจากแยกวิเคราะห์ไวยากรณ์บรรทัดคำสั่งต่างกันในที่สุดทั้งหมดเหล่านี้จะสิ้นสุดในเส้นทางรหัสเดียวกันภายในsystemctlโปรแกรม

หมายเหตุ:

  • พฤติกรรมแบบดั้งเดิมของตัวเลือกน้อยshutdown nowได้รับการเปลี่ยนไปใช้โหมดผู้เดียว นี่ไม่ใช่กรณีที่มี systemd rescue.target- โหมดผู้ใช้คนเดียวที่ถูกเปลี่ยนชื่อโหมดช่วยเหลือใน systemd - ไม่สามารถเข้าถึงได้ด้วยshutdownคำสั่ง
  • telinit จริงๆไม่สนใจทั้งหมดเหล่านั้นและการเชื่อมโยงสัญลักษณ์ในระบบแฟ้มที่หน้าคู่มืออธิบาย การแม็พก่อนหน้านี้ถูกเดินสายเข้าในโปรแกรมในตารางrunlevelN.targetdefault.targetsystemctl
  • systemd มีความคิดของไม่มีระดับการทำงานในปัจจุบัน การทำงานของคำสั่งเหล่านี้ไม่เป็นไปตามเงื่อนไข "ถ้าคุณอยู่ในระดับรันN "
  • --forceตัวเลือกไปhalt, rebootและpoweroffคำสั่งเป็นเช่นเดียวกับการพูดว่า--force --forceไปsystemctl halt, systemctl rebootและsystemctl poweroffคำสั่ง ทำให้systemctlลองโทรออกreboot()โดยตรง โดยปกติจะพยายามแยกเป้าหมาย
  • telinitinitไม่ได้เป็นเช่นเดียวกับ พวกเขาเป็นโปรแกรมที่แตกต่างกันในโลก systemd หลังเป็นชื่ออื่นสำหรับsystemdโปรแกรมไม่ใช่สำหรับsystemctlโปรแกรม systemdโปรแกรมไม่จำเป็นต้องรวบรวมกับใด ๆ เข้ากันได้รถตู้ Smoorenburg ที่ทั้งหมดและในบางระบบปฏิบัติการ systemd บ่นเกี่ยวกับการถูกเรียกไม่ถูกต้องถ้าหนึ่งในความพยายามinit N

อ่านเพิ่มเติม


1
นี่เป็นคำทั่วไปสำหรับระบบ Linux ที่ทันสมัยที่สุดดังนั้นตัวอย่างเช่นคำตอบwiert.me/2012/12/30/ …หลังจากหลายปีที่ผ่านมาฉันสงสัยว่าในที่สุดฉันก็เข้าใจว่าเกิดอะไรขึ้นและทำไม
Jeroen Wiert Pluimers

systemctl rebootsystemctl start reboot.target --job-mode=replace-irreversibleควรจะเทียบเท่ากับ การใช้โหมดงานอื่น ๆ จะมีประสิทธิภาพน้อยกว่า unix.stackexchange.com/questions/381739/…
sourcejedi

1
ฉันอ่านข้อความตอบกลับทั้งหมดของคุณและซึมซับสิ่งที่ทำได้ ยังคงมีคำถามหนึ่งคำถามเดียวกับที่ฉันมาที่นี่คือsystemctl rebootวิธี "ปลอดภัย" ในการรีบูตเช่นinit 6ซึ่งเป็นวิธีที่เราจะรีบูตเครื่องอย่างปลอดภัยหรือไม่
Brian Thomas

25
  • haltสั่งให้ฮาร์ดแวร์หยุดการทำงานของ CPU ทั้งหมดแต่ปล่อยให้มันอยู่ในสถานะเปิดเครื่อง ซึ่งมักจะหมายถึงบางคนต้องรีบู๊ตหรือปิดเครื่องด้วยตนเองโดยกดปุ่มเปิดปิดหลังจากนั้น วิธีเฉพาะเพื่อให้บรรลุนี้เป็นสถาปัตยกรรมเฉพาะ แต่เช่นชุดคำสั่ง x86 ให้HLTคำแนะนำที่หยุดหน่วยการประมวลผลกลาง (CPU) จนกระทั่งหยุดการขัดจังหวะภายนอกครั้งถัดไป

  • poweroffเช่นhaltหยุด CPU แต่ยังส่งสัญญาณฮาร์ดแวร์ACPIซึ่งจะสั่งให้ระบบเริ่มต้นด้วยการปิดระบบที่สมบูรณ์และทันที นี่เทียบเท่ากับการกดปุ่มเปิดปิดบนคอมพิวเตอร์เดสก์ท็อปทั่วไป

ทั้งสองhaltและpoweroffมีการเชื่อมโยงมักสัญลักษณ์rebootปฏิบัติการซึ่งมักจะเรียกใช้shutdownเครื่องมือที่มีข้อโต้แย้งที่เหมาะสม ( -h, -Pหรือr) ขึ้นอยู่กับว่าhalt, poweroffหรือrebootถูกใช้ในการเรียกใช้เครื่องมือ อย่างไรก็ตามเมื่อ--forceตัวเลือกถูกส่งไปยังrebootหรือเมื่ออยู่ใน runlevel 0 หรือ 6 rebootจะเรียกการเรียกของreboot()ระบบด้วยรหัสคำสั่งที่เหมาะสมเอง


โทมัสขอบคุณมากที่อธิบาย ฉันสนใจที่จะรู้ว่าสิ่งที่เกี่ยวกับการทำ #init 0 มีความแตกต่างไม่มากใช่ไหม
Win.T

@ Win.T สลับไป runlevel 0 ใช้เช่น/sbin/init 0หรือ/sbin/telinit 0ควรจะเป็นเช่นเดียวกับระบบลังเลแม้ว่าขั้นตอนเฉพาะที่ถ่ายจะขึ้นอยู่กับระบบ init ในคำถามเช่นระบบ-V init , พุ่งพรวดหรือsystemd หากคุณใช้ RHEL คุณจะใช้ systemd
Thomas Nyman

4
หมายเหตุถึงตัวเอง: ทุกครั้งที่มีคนบ่นเกี่ยวกับการเรียก arcane Win32 API แสดงให้พวกเขารีบูต (2)
user253751

@immibis แต่การรีบูตเป็นสิ่งที่มีความลับโดยเฉพาะ มันต้องใช้ธงเวทมนต์เพื่อให้มันยากมากที่จะทำโดยอุบัติเหตุ
Kevin Cox

4
@KevinCox นั่นคือเหตุผลที่ต้องใช้ธงเวทมนตร์ ไม่ใช่อาร์กิวเมนต์สำหรับการยอมรับค่าที่แตกต่างกัน 4 ค่าสำหรับ magic2 และสำหรับการทำงานที่แตกต่างกันภายในเนมสเปซ PID และสำหรับการดำเนินการที่เกี่ยวข้องกับการทำงานที่แทบจะไม่เกี่ยวข้อง (เช่นการตั้งค่าลักษณะการรีบูตบน Ctrl-Alt-Delete)
user253751

1

halt, poweroffและshutdown -hเทียบเท่าสมบูรณ์ ในความเป็นจริงและหยุด poweroff ทำอะไร shutdown -hแต่โทร จาก manpage หยุด / poweroff:

หากหยุดหรือเริ่มระบบใหม่เมื่อระบบไม่ได้อยู่ใน runlevel 0 หรือ 6 กล่าวอีกนัยหนึ่งเมื่อทำงานตามปกติการปิดระบบจะถูกเรียกใช้แทน (ด้วยแฟล็ก -h หรือ -r) สำหรับข้อมูลเพิ่มเติมดู manpage ปิด (8)

การปิดระบบจะดำเนินต่อเพื่อปิดระบบโดยเปลี่ยนเป็น runlevel 0

หยุดและ poweroff (และรีบูต) ดำเนินบทบาทคู่; เมื่อดำเนินการในกระบวนการปิด (เช่นใน runlevel 0 หรือ 6) พวกเขาดำเนินการในระดับต่ำที่จำเป็นในการหยุดร่างกายปิดหรือรีบูตเครื่องตามที่อธิบายไว้ในคำตอบอื่น


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