เรียกใช้สคริปต์ในการออกจากระบบโดยไม่ใช้ Logout Hook


11

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

น่าเสียดายที่แม้ว่าlaunchdจะเป็นทางเลือกที่สะดวกในการเข้าสู่ระบบ hooks แต่ไม่มีการแทนที่อย่างชัดเจนสำหรับ hooks ออกจากระบบ

ฉันได้ทดลองกับการสร้างเชลล์สคริปต์ที่เปิดตัวในการเข้าสู่ระบบแล้วก็หลับจนกว่าจะได้รับสัญญาณการฆ่าอย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ทำงาน (สคริปต์ไม่เคยรับสัญญาณในระหว่างการทำงานปกติ)

ไม่เช่นนั้นฉันไม่แน่ใจว่าวิธีที่ดีที่สุดในการเรียกใช้คำสั่งด่วนในการออกจากระบบคืออะไร ฉันรู้ว่ามีสาธารณูปโภคของบุคคลที่สามบางอย่างที่สามารถทำได้ แต่มีวิธี "ถูกต้อง" ในการทำเช่นนี้อีกต่อไป?

คำตอบ:


7

ดูเหมือนว่า 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 ;'(พร้อมหลุมฝังศพต่อหน้าเซมิโคลอน)
Jason

อ๊ะคุณพูดถูก @Jason ฉันคิดว่าฉันทำให้มันง่ายขึ้นมากฉันบิดมันให้คล้ายกับตัวอย่างการทำงานมากขึ้น
Haravikk

มันทริกเกอร์เมื่อฉันยกเลิกการโหลดโดยใช้ launchctl แต่ไม่ใช่เมื่อฉันออกจากระบบหรือรีสตาร์ท ทำไม?
Trellis

มีวิธีเรียกใช้ก่อนที่เครือข่ายจะล่มหรือไม่?
ฟิลิปโป

2

คุณสามารถใช้ iHook เพื่อเรียกใช้ hooks hook / logout ซึ่งฉันได้พบว่ายังใช้งานได้กับการลงชื่อเข้าใช้แบบไม่โต้ตอบและ hooks logout ที่เขียนใน Bash และ Python บน Yosemite

http://rsug.itd.umich.edu/software/ihook/


น่าเสียดายที่อันนี้ยังคงใช้ hooks ล็อกเอาต์ปกติภายใต้ประทุน
0942v8653

0

หากคนอื่น ๆ ที่มาที่นี่จากเครื่องมือค้นหาไม่สนใจใช้ตะขอล็อกเอาต์ให้รันตัวอย่าง:

sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook

จากนั้น~/.logouthookจะถูกเรียกใช้ในครั้งต่อไปที่คุณออกจากระบบ

ค่าของLogoutHookคีย์ต้องเป็นพา ธ ไปยังไฟล์ที่เรียกทำงานได้และไม่ใช่คำสั่งเชลล์ ปรับเปลี่ยนคำสั่งdefaults/var/root/Library/Preferences/com.apple.loginwindow.plist


ขอบคุณที่ให้มันเป็นทางเลือกอยู่ดี แต่ข้อกังวลของฉันคือว่า hooks การเข้าสู่ระบบและออกจากระบบเลิกใช้แล้วสำหรับ OS X รุ่นล่าสุด แม้ว่าฉันคาดหวังว่าพวกเขายังคงทำงานใน Yosemite (เนื่องจากส่วนใหญ่จะเน้นที่การเปลี่ยนแปลง UI และต่อเนื่อง) ดูเหมือนว่ามันจะไปได้ตลอดเวลาเช่นรายการเริ่มต้นเก่าที่ถูกแทนที่ด้วยlaunchdความอัปยศที่ไม่มีRunBeforeUnloadหรือตัวเลือกที่คล้ายกัน .
Haravikk

0

ฉันไม่สามารถเรียกใช้ไอเท็ม launchd logout ให้ทำงานใน 10.10.1 ได้เช่นกัน แต่คีย์ LogoutHook ใน "com.apple.loginwindow.plist" ของรูทนั้นทำงานได้ดี มีตัวอย่างอื่น ๆ สำหรับวิธีการเปิดตัว?

อย่างไรก็ตามฉันเขียน AppleScript เพื่อฆ่าระดับเสียงของระบบเมื่อออกจากระบบเพื่อให้เสียงระฆังเริ่มต้นจะไม่ได้ยินในการเริ่มต้นครั้งถัดไป สิ่งที่ฉันไม่ได้ทำคือรายละเอียดสำหรับการจัดการคำสั่งล็อกเอาต์หลายอันโดยใช้คีย์ LogoutHook เดียวหรือว่าเป็นไปได้ที่จะเก็บคีย์ LogoutHook หลายคีย์ดังนั้นฉันยังสนใจวิธีการ Launchd ซึ่งสามารถจัดการกับ Lingon ได้ หรือ Lingon 3 ซึ่งมีขอบเขตที่แคบกว่าเดิมมาก (น่าจะมีอยู่ใน App Store)

ตั้งค่า current_Vol เป็น (ทำเชลล์สคริปต์ "osascript -e \" เอาต์พุตระดับเสียงของ (รับการตั้งค่าระดับเสียง) \ "")
หากปุ่มที่ส่งคืนของ (กล่องโต้ตอบแสดง "คุณต้องการปิดเสียงกระดิ่งสำหรับเริ่มต้นเรียกคืนหรือยกเลิกหรือไม่" ปุ่ม {"เงียบ", "กู้คืน", "ยกเลิก"} ปุ่มเริ่มต้น 1) คือ "เงียบ"
    ทำเชลล์สคริปต์ "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# สคริปต์ออกจากระบบ
osascript -e \ "set volume 0 \" '> / usr / local / logouttask / logoutscript; sudo ค่าเริ่มต้นเขียน com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutscript, chmod + x / usr / local / logouttask "ด้วยสิทธิ์ผู้ดูแลระบบ
อื่น
    ลอง
        ทำสคริปต์เชลล์ "ค่าเริ่มต้น sudo เขียน com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript" ด้วยสิทธิ์ผู้ดูแลระบบ
        กล่องโต้ตอบการแสดงผล "เสียงระฆังเริ่มต้นจะได้ยินหากการตั้งค่าระดับเสียงมากกว่า 0 เมื่อปิดเครื่องหรือรีสตาร์ท" ปุ่มเริ่มต้น {"ตกลง"} 1
    ในข้อผิดพลาดหมายเลข error_message หมายเลข error_number
        ถ้า error_number เท่ากับ 1 ดังนั้น
            กล่องโต้ตอบการแสดงผล "สคริปต์ที่ตั้งค่าระดับเสียงของระบบเป็นศูนย์เมื่อออกจากระบบจะไม่ได้ยินเสียงการเริ่มต้นหากการตั้งค่าระดับเสียงมีค่ามากกว่า 0 เมื่อปิดเครื่องหรือเริ่มใหม่" ปุ่มเริ่มต้น {"ตกลง"} 1
        อื่น
            ไดอะล็อกแสดงผล "ข้อผิดพลาด:" & the error_number & "." & ปุ่ม error_message {"ตกลง"} ปุ่มเริ่มต้น 1
        จบถ้า
    จบลอง
จบถ้า

คุณเรียกใช้รายการออกจากระบบได้อย่างไร เชลล์สคริปต์ตัวอย่างของฉันสำหรับความต้องการที่จะเรียกใช้โดยตรง (ไม่มีประโยชน์sh) ดังนั้นจึงจำเป็นต้องเป็นไฟล์ที่สามารถเรียกใช้งานได้ฉันจะทราบว่าในคำตอบของฉัน
Haravikk

ขอบคุณสำหรับการอัพเดท ฉันจะลองโดยเร็วที่สุดและแจ้งให้คุณทราบ
Trellis

ฉันสามารถทริกเกอร์เหตุการณ์ที่มีอยู่ใน foo.sh โดยเรียกใช้ "launchctl unload" บน plist ที่เรียกใช้ในเทอร์มินัล การออกจากระบบไม่ได้เป็นการกระตุ้น
Trellis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.