ใช้คำสั่ง Terminal เพื่อปิดเครื่องรีสตาร์ทและ Sleep My Mac หรือไม่


120

ฉันได้รับความสนใจในการใช้ Terminal มากขึ้นเป็นอีกทางเลือกหนึ่งในการแก้ไขปัญหาบน Mac ของฉัน ฉันเคยเห็นคำถามนี้เรื่อง"มีวิธีที่ดีกว่าในการปิด / รีสตาร์ท OSX หรือไม่?" .

ฉันอยากรู้ว่า:

วิธีการปิดรีสตาร์ทและสลีป Mac ของฉันโดยใช้คำสั่งเทอร์มินัลโดยเฉพาะ?


รีบูตเครื่องสำหรับการรีสตาร์ทยังใช้งานได้
atilkan

คำตอบ:


147

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

คำสั่งใช้พารามิเตอร์ -h, -r หรือ -s เพื่อปิดรีสตาร์ทหรือสลีป Mac

คำสั่งจะต้องถูกเรียกใช้ในฐานะรูทดังนั้นคุณต้องใช้ sudo

เช่นรีบูตเครื่องทันที

sudo shutdown -r now

เช่นเพื่อปิดเครื่องใน 60 นาที

sudo shutdown -h +60

จากความคิดเห็นมีสองสิ่งที่ต้องแก้ไข

วิธีการปิดการทำงานคือการส่ง sigterm ไปยังกระบวนการทั้งหมดซึ่งควรจัดการกับสิ่งนั้นเช่นบันทึกไฟล์ที่เปิดเป็นต้นหากไม่ออกจากนั้นพวกเขาจะได้รับ SIGKILL ซึ่งบังคับให้พวกเขาตายโดยไม่มีโอกาสตอบกลับ สัญญาณจะไม่ถูกส่งผ่านคิวข้อความคีย์ปกติดังนั้นแอปจะต้องจัดการกับสิ่งนี้แยกจากกันกับรหัสที่ถูกเรียกจากออกจากเมนู แอปที่ดีควรเรียกใช้รหัสทั่วไปจากทั้งคู่

คำตอบอื่น ๆนี้แสดงวิธีการปิดราวกับว่าคุณกดตัวเลือกเมนู แต่โปรดทราบว่าแอพสามารถยกเลิกการปิดเครื่องนี้ได้


2
อาจจะไม่เกี่ยวข้องกันเล็กน้อยกับคำถามและคำตอบนี้ แต่สำหรับสิ่งที่คุ้มค่านอกจากนี้ยังมีประโยชน์สำหรับผมที่จะล็อคฉัน Mac จากสถานีชนิดเช่นการกดปุ่ม Winkey + L ใน /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspendWindows: ฉันมีมัน aliased ในแฟ้มที่มีที่มาใน .bash_profile ของฉันดังนี้alias lock='/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend'
rubynorails

มัน "บอกแอปทั้งหมดเพื่อปิดไฟล์ ฯลฯ " จริง ๆ หรือไม่ ฉันคิดว่ามันจะฆ่าทุกอย่างเหรอ? man page มาจากปี 1998 BSD - Apple ได้ปรับปรุงคำสั่งเพื่อพูดคุยกับซอฟต์แวร์ macOS หรือไม่? มีประโยชน์หากสิ่งต่าง ๆ หยุดทำงาน แต่ถ้าระบบทำงานได้ดีดูเหมือนจะบอกให้กระบวนการล็อกอินเรียกใช้การกระทำนั้นเป็น "สุภาพ" มากกว่า
j-beda

@ j-beda ดูผู้พัฒนาเอกสารของ Apple Apple.com/legacy/library/documentation/Darwin/ ...... - ส่ง SIGTERM ที่แอปควรจัดการก่อนที่จะได้รับ SIGKILL ดูคำตอบอื่น ๆ สำหรับการทำมันผ่านหน้าต่างเข้าสู่ระบบ / GUI ที่จริงแล้ววิธีการเข้าสู่ระบบหน้าต่างจะทำโฉนด?
user151019

ฉันค่อนข้างแน่ใจว่า Unix "shutdown" ไม่ได้ทำทุกอย่างที่กระบวนการปิด Mac Mac ปกติทำดังนั้นเท่าที่ Apple ไม่ใช้ในซอฟต์แวร์ของตัวเองโดยตรง แต่อย่างน้อยก็ทำอะไรบางอย่างก่อนที่จะเรียก มันมีข้อเสียบางอย่างที่จะเรียกใช้โดยตรง ฉันเชื่อว่าแอป "loginwindow" สามารถใช้งานได้แม้ว่าจะไม่ได้อยู่ที่หน้าต่างการเข้าสู่ระบบ GUI และสามารถเรียกใช้ผ่านเครื่องมือ "osascript" บรรทัดคำสั่ง อย่างไรก็ตามมันไม่ผิดพลาดดังนั้นเราอาจต้องเรียกใช้ "การปิดระบบ" อย่างใดอย่างหนึ่ง (หรือส่งการสังหารบุคคลไปยังกระบวนการเฉพาะที่ฉันคิด)
j-beda

กลไกสัญญาณไม่ได้ใส่ข้อความลงในคิวข้อความของแอพเนื่องจากการปิดตามปกติไม่ได้ทำ แต่แอปยังคงควรจัดการกับมัน เช่นถ้ามันทำงานไม่ถูกต้องนั่นเป็นความผิดของแอพ สำหรับความพยายามที่ GUI ดูคำตอบอื่น แต่ฉันพบว่ามักจะมีแอพที่ปฏิเสธที่จะตายและยกเลิกกระบวนการออกดังนั้นการปิดเป็นวิธีเดียวที่ guranetted
user151019

94

ปิดเครื่องโดยไม่แสดงข้อความยืนยัน:

osascript -e 'tell app "System Events" to shut down'

ปิดตัวลงหลังจากแสดงกล่องโต้ตอบการยืนยัน:

osascript -e 'tell app "loginwindow" to «event aevtrsdn»'

รีสตาร์ทโดยไม่แสดงกล่องโต้ตอบการยืนยัน:

osascript -e 'tell app "System Events" to restart'

รีสตาร์ทหลังจากแสดงกล่องโต้ตอบการยืนยัน:

osascript -e 'tell app "loginwindow" to «event aevtrrst»'

ออกจากระบบโดยไม่แสดงข้อความยืนยัน:

osascript -e 'tell app "System Events" to  «event aevtrlgo»'

ออกจากระบบหลังจากแสดงกล่องโต้ตอบการยืนยัน:

osascript -e 'tell app "System Events" to log out'

ไปนอน ( pmset):

pmset sleepnow

ไปที่โหมดสลีป (AppleScript):

osascript -e 'tell app "System Events" to sleep'

นำจอแสดงผลเข้าสู่โหมดสลีป (10.9 ขึ้นไป):

pmset displaysleepnow

AERegistry.hสี่รหัสตัวอักษรสำหรับเหตุการณ์ที่แอปเปิ้ลมีการระบุไว้ใน

คำสั่งกิจกรรมระบบทั้งหมดข้างต้นส่งกิจกรรม Apple ไปที่loginwindowกระบวนการ loginwindowจะถูกส่งเหตุการณ์ Apple เดียวกันกับด้านบนเมื่อคุณออกจากระบบรีสตาร์ทปิดเครื่องหรือทำให้ Mac เข้าสู่โหมดสลีปตามปกติ ดูเทคนิคถาม & ตอบ QA1134: ทำให้เกิดการรีสตาร์ทปิดและ / หรือออกจากระบบโดยทางโปรแกรม

ตามที่man shutdown, shutdown -h nowและshutdown -r nowส่งกระบวนการTERMสัญญาณตามด้วยKILLสัญญาณ

ตามDaemons และคู่มือการเขียนโปรแกรมบริการเมื่อคุณบอกloginwindowให้ออกจากระบบกระบวนการที่สนับสนุนการเลิกจ้างกระทันหันจะส่งKILLสัญญาณและกระบวนการที่ไม่สนับสนุนการเลิกจ้างกะทันหันถูกยกเลิกในรูปแบบที่แตกต่างกัน: แอปพลิเคชัน Cocoa ได้รับapplicationShouldTerminate:วิธีผู้แทน รับkAEQuitApplicationเหตุการณ์ Apple แอปพลิเคชันพื้นหลังรับkAEQuitApplicationเหตุการณ์ Apple ตามด้วยKILLสัญญาณและ daemons จะรับTERMสัญญาณตามด้วยKILLสัญญาณหลังจากนั้นไม่กี่วินาที


-4

ปิดเครื่องทันที:

**sudo shutdown -h now**

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

**sudo shutdown -h +30**

(-h พารามิเตอร์กำหนดเวลาปิดระบบโดยที่ (+) 30 นาทีเพื่อหยุดระบบ)


2
ข้อมูลที่นำเสนอในคำตอบของคุณรวมอยู่ในคำตอบที่ยอมรับแล้วและไม่จำเป็นต้องทำซ้ำสิ่งที่ถูกกล่าวถึงและยอมรับ
user3439894

-11

ยังมีประโยชน์ในการออกจากระบบพรอมต์บรรทัดคำสั่ง terminal พิมพ์ 'exit':

[host:~user]$ exit

10
วิธีนี้ปิดตัวลงให้รีสตาร์ทหรือหลับ Mac?
bmike

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