ดูเหมือนว่า Apple จะไม่สนใจในการแทนที่ hook ออกจากระบบเนื่องจากพวกเขาปิดปัญหาของฉันที่สอบถามเกี่ยวกับสิ่งหนึ่ง
อย่างไรก็ตามหนึ่งในการปรับปรุงในโยเซมิตีคือตอนนี้ launchd ส่งสัญญาณไปยังเชลล์สคริปต์อย่างถูกต้อง สิ่งนี้หมายความว่าตอนนี้คุณสามารถทำงานออกจากระบบเช่น:
นี่คือตัวอย่าง logout.sh:
#!/bin/sh
onLogout() {
echo 'Logging out' >> ~/Logs/logout.sh.log
exit
}
trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
sleep 86400 &
wait $!
done
สิ่งนี้จะเป็นการนอนหลับ (แบบอะซิงโครนัสการทำมันแบบซิงโครนัสโดยไม่มีเครื่องหมายและไม่ทำงาน) จนกว่าจะได้รับสัญญาณที่ติดอยู่หนึ่งจุดซึ่งมันจะใช้งานonLogout
ฟังก์ชัน
สิ่งที่คุณต้องทำคือเปิดตัวสคริปต์นั้นโดยใช้RunAtLoad
ตัวแทนการเปิดใช้งานหรือ launch daemon และมันจะทำงานเมื่อออกจากระบบหรือปิดเครื่อง แต่สิ่งสำคัญที่ต้องคำนึงถึงคืองานมีระยะเวลา จำกัด ก่อนที่จะถูกฆ่าแทน ดังนั้นจึงไม่ควรใช้เพื่อเรียกใช้สิ่งใด ๆ ที่ใช้เวลานานหรือต้องการการเชื่อมต่อเครือข่ายที่อาจล่าช้าเป็นต้น
แน่นอนว่านี่เป็นประโยชน์สำหรับทุกคนใน Mavericks หรือก่อนหน้านี้ แต่ภายใต้โยเซมิตีตอนนี้ดูเหมือนว่าจะทำงานได้ตามที่คาดไว้ ดังนั้นฉันจึงทำถูกแล้วตั้งแต่แรกlaunchd
ไม่ได้ส่งสัญญาณอย่างถูกต้อง :)
หมายเหตุ: สำหรับการทำงานเชลล์สคริปต์ที่ดูเหมือนว่าจะต้องมีการดำเนินการโดยตรงโดยการเปิดตัวคือ - sh
มันไม่ควรเรียกผ่าน ดังนั้นถ้ามันถูกวางใน~/Library/Scripts/foo.sh
อาร์กิวเมนต์โปรแกรมของคุณอาจมีลักษณะดังนี้:
<key>ProgramArguments</key>
<array>
<string>~/Library/Scripts/foo.sh</string>
<string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
line 8: syntax error near unexpected token ;'
(พร้อมหลุมฝังศพต่อหน้าเซมิโคลอน)