Tampaknya Apple tidak tertarik dengan penggantian kait logout, karena mereka menutup masalah saya untuk menanyakannya.
Namun, salah satu perbaikan di Yosemite adalah launchd sekarang mengirim sinyal ke skrip shell dengan benar. Artinya, Anda sekarang dapat melakukan tugas log-out seperti:
Berikut ini contoh 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
Ini hanya akan tidur (asynchronous, melakukannya secara sinkron tanpa ampersand tampaknya tidak berfungsi) sampai menerima salah satu sinyal yang terperangkap, pada titik mana ia akan menjalankan onLogout
fungsinya.
Yang perlu Anda lakukan adalah meluncurkan skrip itu menggunakan RunAtLoad
agen peluncuran atau daemon peluncuran dan itu akan berjalan pada saat log-out atau shutdown, meskipun penting untuk diingat bahwa tugas-tugas hanya memiliki waktu terbatas untuk diselesaikan sebelum mereka dibunuh sebagai gantinya , jadi ini tidak boleh digunakan untuk menjalankan apa pun yang membutuhkan waktu lama, atau memerlukan koneksi jaringan yang bisa ditunda dll.
Tentu saja ini tidak ada gunanya bagi siapa pun di Mavericks atau sebelumnya, tetapi di bawah Yosemite ini sekarang tampaknya berfungsi seperti yang diharapkan; jadi saya benar-benar melakukannya dengan benar, launchd
hanya saja tidak mengirimkan sinyal dengan benar :)
CATATAN: Agar ini berfungsi, skrip shell tampaknya perlu dijalankan secara langsung dengan diluncurkan, yaitu - skrip itu seharusnya tidak dipanggil sh
. Jadi jika itu ditempatkan dalam ~/Library/Scripts/foo.sh
argumen program Anda mungkin terlihat seperti:
<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 ;'
(dengan kuburan sebelum semi-kolon)Anda dapat menggunakan iHook untuk menjalankan kait masuk / keluar, yang saya temukan masih berfungsi untuk masuk non-interaktif dan kait keluar yang ditulis dalam Bash dan Python di Yosemite.
http://rsug.itd.umich.edu/software/ihook/
sumber
Jika orang lain yang datang ke sini dari mesin pencari tidak peduli menggunakan kait logout, jalankan misalnya:
sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook
Kemudian
~/.logouthook
dijalankan saat Anda keluar berikutnya.Nilai
LogoutHook
kunci harus menjadi path ke executable dan bukan perintah shell. Thedefaults
perintah memodifikasi/var/root/Library/Preferences/com.apple.loginwindow.plist
.sumber
launchd
, hanya rasa malu itu tidak memilikiRunBeforeUnload
atau opsi serupa .Saya juga tidak bisa mengaktifkan item logout launchd di 10.10.1, tetapi kunci LogoutHook di "com.apple.loginwindow.plist" root berfungsi dengan baik. Apakah ada contoh lain untuk metode launchd?
Ngomong-ngomong, saya menulis AppleScript untuk mematikan volume sistem saat logout sehingga bunyi loncatan startup tidak akan terdengar pada startup berikutnya. Yang belum saya lakukan adalah detail untuk mengelola beberapa perintah logout berdasarkan pada satu kunci LogoutHook, atau apakah mungkin untuk menyimpan beberapa kunci LogoutHook, jadi saya masih tertarik dengan metode Launchd, yang dapat dikelola dengan Lingon, atau bahkan Lingon 3, yang memiliki cakupan jauh lebih sempit dari aslinya (mungkin ada di App store).
sumber
sh
) sehingga harus berupa file yang dapat dieksekusi, saya akan perhatikan bahwa dalam jawaban saya.