ฉันจะทำให้ Mac OS X รันโปรแกรมก่อนที่จะปิดเครื่องได้อย่างไร


9

ฉันพยายามรับ Mac OS X เพื่อบันทึก VirtualBox VM ทั้งหมดของฉันเมื่อรีบูตเครื่อง ฉันมีสคริปต์ที่ทำสิ่งนี้แล้ว แต่ฉันต้องการ OS X เพื่อเรียกใช้สคริปต์นี้โดยอัตโนมัติก่อนรีบูต

เมื่อ Mac OS X รีบูตเครื่องจะรัน / sbin / reboot หรือไม่

หรือวิธีนี้สามารถทำได้?


คำถามที่ซ้ำกันที่นี่: apple.stackexchange.com/questions/16825/ …
michaelmichael

นั่นไม่ซ้ำกัน ฉันไม่ต้องการทราบวิธีเรียกใช้สคริปต์หรือโปรแกรมเมื่อออกจากระบบ ฉันต้องการทราบวิธีเรียกใช้สคริปต์หรือโปรแกรมเมื่อปิดเครื่อง
Andrew J. Brehm

1
คุณถูก. ไม่ซ้ำกันแน่นอน คำตอบในคำถามที่เชื่อมโยงแนะนำให้ผู้ใช้วางสคริปต์ของตน/etc/rc.shutdown.localเพื่อเรียกใช้เมื่อปิดระบบ ดูเหมือนว่าเป็นสิ่งที่คุณกำลังมองหา
michaelmichael

ไซต์นี้ดูเหมือนจะอ้างสิทธิ์ดังกล่าว: hints.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm

วิธี rc.shutdown.local ไม่ทำงาน
Andrew J. Brehm

คำตอบ:


5

แม้ว่า Apple แนะนำให้ใช้ " launchd " วิธีที่ง่ายที่สุดคือสร้างเชลล์สคริปต์โดยใช้ตัวอย่างเช่น pico ของเทอร์มินัล:

pico /Users/Shared/logoutHook.sh

ไฟล์สามารถมีสิ่งที่ชอบ:

#!/bin/bash
say 'Hasta la vista baby!'

จากนั้นให้สิทธิ์การดำเนินการ:

sudo chmod +x /Users/Shared/logoutHook.sh

สุดท้ายให้ขอสคริปต์ไปยังขั้นตอนการล็อกเอาต์:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

หากคุณเริ่มแอปพลิเคชันอื่นเนื่องจากฉันยังไม่ได้ทดสอบสิ่งนี้ฉันคิดว่าอาจเป็นประโยชน์ในการเตือนตัวเองและคุณว่า:

  • เราอาจต้องฆ่าสัญญาณการปิดเครื่องเพื่อให้ทำงานตามที่เราต้องการ

  • จากนั้นส่งอันใหม่ (ระวังอย่าฆ่าสัญญาณที่ส่งมาจาก
    สคริปต์ของเรา) ...


หากคุณต้องการลบเบ็ด:

sudo defaults delete com.apple.loginwindow LogoutHook

หากใช้ " launchd " ความคิดก็คือการจับสัญญาณ SIGTERM ดูได้ที่: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

launchd ส่งคำเตือนแรกของการปิดสคริปต์ทั้งหมด / ภูตที่มีStopService () ย่อย สิ่งนี้ทำให้กระบวนการของคุณใช้เวลาส่วนใหญ่ในการทำความสะอาด

เพียงใช้ launchd เพื่อเริ่มสคริปต์และให้มันทำงานในพื้นหลังจนกว่าจะถึงเวลาออก

หลังจากบริการที่ได้รับการเตือนล่วงหน้าถูกปิดลงกระบวนการทั้งหมดจะได้รับSIGTERMสัญญาณไม่กี่วินาทีก่อนที่SIGKILLพวกเขาจะอบ

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


จากมุมมองทางประวัติศาสตร์ - /sbin/rebootและระดับการวิ่งไม่เคยมีอยู่ในดาร์วิน / OS X และrc.shutdownเลิกใช้แล้วพร้อมกับส่วนที่เหลือของrcตอนนี้ซึ่งlaunchdเป็นเจ้านาย คุณอาจจะสามารถใช้ rc.shutdown กับ tiger หรือรุ่นก่อนหน้า (ฉันไม่ได้มีหนึ่งในภาพที่มีประโยชน์ในการตรวจสอบในปัจจุบัน) Lion ได้ลบร่องรอยทั้งหมดของ rc.d และ init.d แล้ว

คุณอาจต้องการดูว่าsleepwatcherช่วยคุณได้ไหม ฉันไม่ได้ใช้มันมาระยะหนึ่งแล้ว แต่มันก็มีจุดมุ่งหมายที่จะแก้ไขปัญหาของคุณอย่างแน่นอน


ปรากฎว่า "เลิกใช้แล้ว" หมายถึง "ไม่ทำงาน" :-(
Andrew J. Brehm

ใช่ - คำเตือนเริ่มต้นที่ Tiger และฉันเดาว่ามันหายไปกับ Leopard - มันยากที่จะเรียกคืนการเปลี่ยนแปลง Lion ทั้งหมดที่วิ่งไปรอบ ๆ สมองของฉัน
bmike

เรื่องนี้ซับซ้อนมากและทำให้ Mac OS X เป็นแพลตฟอร์มเซิร์ฟเวอร์ที่แย่มาก
Andrew J. Brehm

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

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