Jalankan Script on Logout Tanpa Menggunakan Hook Logout

11

Saya telah mencari untuk menjalankan beberapa perintah pembersihan ketika pengguna keluar, namun fitur kait keluar yang lama, meskipun masih berfungsi, telah ditinggalkan untuk beberapa waktu sekarang jadi mungkin tidak bersama kami lebih lama.

Sayangnya, meskipun launchdmenyediakan alternatif yang nyaman untuk kait masuk, tidak ada pengganti yang jelas untuk kait keluar.

Saya sudah bereksperimen dengan membuat skrip shell yang diluncurkan saat login, dan hanya tidur sampai sinyal kill diterima, namun ini sepertinya tidak berhasil (skrip tidak pernah menerima sinyal selama operasi normal).

Kalau tidak, saya tidak yakin apa cara terbaik untuk menjalankan perintah cepat saat keluar? Saya tahu ada beberapa utilitas pihak ketiga yang dapat melakukannya, tetapi apakah ada cara yang "benar" untuk melakukan ini lagi?

Haravikk
sumber

Jawaban:

7

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 onLogoutfungsinya.

Yang perlu Anda lakukan adalah meluncurkan skrip itu menggunakan RunAtLoadagen 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, launchdhanya 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.shargumen program Anda mungkin terlihat seperti:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
Haravikk
sumber
Ketika saya menjalankan skrip ini, ia mengembalikan line 8: syntax error near unexpected token ;'(dengan kuburan sebelum semi-kolon)
Jason
Aduh, kau benar @Jason, kurasa aku terlalu menyederhanakannya, aku sudah men-tweak agar lebih mirip dengan contoh yang berfungsi.
Haravikk
Itu memicu ketika saya membongkar menggunakan launchctl, tetapi tidak ketika saya logout atau restart. Mengapa?
Teralis
Apakah ada cara untuk menjalankannya sebelum jaringan mati?
filippo
2

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
Sayangnya yang ini masih menggunakan kait logout normal di bawah tenda.
0942v8653
0

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 ~/.logouthookdijalankan saat Anda keluar berikutnya.

Nilai LogoutHookkunci harus menjadi path ke executable dan bukan perintah shell. The defaultsperintah memodifikasi /var/root/Library/Preferences/com.apple.loginwindow.plist.

Lri
sumber
Terima kasih telah memberikannya sebagai alternatif, tetapi kekhawatiran saya adalah bahwa kait masuk dan keluar telah ditinggalkan untuk beberapa versi OS X terakhir; walaupun saya berharap mereka masih berfungsi di Yosemite (karena sebagian besar fokus pada perubahan UI dan Berkelanjutan) sepertinya bisa berjalan kapan saja, seperti barang-barang startup lama digantikan oleh launchd, hanya rasa malu itu tidak memiliki RunBeforeUnloadatau opsi serupa .
Haravikk
0

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).

atur current_Vol ke (lakukan skrip shell "osascript -e \" volume keluaran (dapatkan pengaturan volume) \ "")
jika tombol kembali dari (tampilan dialog "Apakah Anda ingin membungkam bunyi startup, mengembalikannya, atau membatalkan?" tombol {"Diam", "Kembalikan", "Batalkan"} tombol default 1) adalah "diam" lalu
    lakukan script shell "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# skrip logout
osascript -e \ "set volume 0 \" '> / usr / local / logouttask / logoutcript; default sudo tulis com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutcript; chmod + x / usr / local / logouttask / logoutcript "dengan hak administrator
lain
    mencoba
        lakukan skrip shell "sudo default tulis com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutcript" dengan hak administrator
        dialog tampilan "Lonceng startup akan terdengar jika pengaturan volume lebih besar dari 0 saat dimatikan atau dimulai ulang." tombol {"OK"} tombol default 1
    pada kesalahan nomor error_message nomor error_number
        jika error_number adalah 1 maka
            dialog display "Skrip yang mengatur volume sistem menjadi nol pada saat logout tidak ada. Lonceng startup akan terdengar jika pengaturan volume lebih besar dari 0 saat dimatikan atau dimulai ulang." tombol {"OK"} tombol default 1
        lain
            dialog tampilan "Error:" & the error_number & "." & tombol error_message {"OK"} tombol default 1
        berakhir jika
    coba berakhir
berakhir jika
Terali
sumber
Bagaimana Anda memohon item logout? Contoh skrip shell saya perlu dipanggil secara langsung (tanpa penggunaan sh) sehingga harus berupa file yang dapat dieksekusi, saya akan perhatikan bahwa dalam jawaban saya.
Haravikk
Terima kasih telah memperbarui. Saya akan mencoba sesegera mungkin dan memberi tahu Anda.
Teralis
Saya hanya dapat memicu acara yang terkandung dalam foo.sh dengan menjalankan "launchctl unload" pada plist yang memanggilnya di Terminal. Keluar tidak memicu itu.
Teralis