Oturum Kapatma Kancasını Kullanmadan Çıkışta Komut Dosyası Çalıştırma


11

Bir kullanıcı oturumu kapattığında birkaç temizleme komutu çalıştırmaya çalışıyordum, ancak eski oturum kapatma kancası özelliği, hala çalışıyor olsa da, bir süredir kullanımdan kaldırıldı, bu yüzden bizimle daha uzun süre olmayabilir.

Ne yazık ki, launchdgiriş kancalarına uygun bir alternatif olmasına rağmen , çıkış kancaları için bu kadar belirgin bir yedek yoktur.

Zaten girişte başlatılan bir kabuk komut dosyası oluşturma denedim ve sadece bir öldürme sinyali alınana kadar uyur, ancak bu işe yaramıyor (komut dosyası normal çalışma sırasında asla sinyal almaz).

Aksi takdirde çıkışta hızlı komut çalıştırmanın en iyi yolunun ne olacağından emin değilim? Bunu yapabilen bazı üçüncü taraf yardımcı programları olduğunu biliyorum, ama artık bunu yapmanın "doğru" bir yolu var mı?

Yanıtlar:


7

Apple, bir çıkış sorgusu değiştirme ile ilgilenmiyor gibi görünüyor.

Bununla birlikte, Yosemite'deki iyileştirmelerden biri, fırlatıcının artık kabuk komut dosyalarına sinyalleri düzgün şekilde göndermesidir. Bunun anlamı, şu şekilde bir oturum kapatma görevi yapabilmenizdir:

İşte bir logout.sh örneği:

#!/bin/sh
onLogout() {
    echo 'Logging out' >> ~/Logs/logout.sh.log
    exit
}

trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
    sleep 86400 &
    wait $!
done

Bu, sıkışıp kalmış sinyallerden birini alana kadar onLogoutişlevi yerine getireceği zamana kadar uyuyacaktır (eşzamansız olarak, ve işareti olmadan eşzamanlı olarak yapmak) .

Tek yapmanız gereken bu komut dosyasını bir RunAtLoadbaşlatma aracısı veya başlatma daemon'u kullanarak başlatmaktır ve çıkış veya kapanışta çalışacaktır, ancak görevlerin öldürülmeden önce tamamlanması için yalnızca sınırlı bir süreye sahip olduklarını unutmayın. , bu nedenle bu işlem uzun zaman alan veya geciktirilebilecek bir ağ bağlantısı gerektiren bir şey çalıştırmak için kullanılmamalıdır.

Tabii ki bu Mavericks veya önceki sürümlerde hiç kimsenin faydası yok, ancak Yosemite altında bu artık beklendiği gibi çalışıyor; bu yüzden aslında ilk etapta doğru yapıyordum, launchdsadece sinyalleri düzgün göndermiyordum :)

NOT: Bunun çalışması için kabuk komut dosyalarının doğrudan başlatılan tarafından yürütülmesi gerekir, yani - üzerinden çağrılmamalıdır sh. Yani ~/Library/Scripts/foo.shprogramınıza yerleştirildiyse, argümanlar şöyle görünebilir:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>

Bu senaryoyu çalıştırdığımda geri dönüyor line 8: syntax error near unexpected token ;'(
Jason

Maalesef haklısın @ Jason, sanırım onu ​​çok basitleştirdim, çalışan bir örneğe daha yakından benzemek için ayarladım.
Haravikk

Launchctl kullanarak kaldırdığımda tetiklenir, ancak oturumu kapattığımda veya yeniden başlattığımda tetiklenmez. Neden?
Kafes

Ağ kesilmeden önce çalıştırmanın bir yolu var mı?
filippo

2

Yosemite'de Bash ve Python'da yazılmış etkileşimli olmayan giriş ve çıkış kancaları için hala çalıştığım giriş / çıkış kancalarını çalıştırmak için iHook'u kullanabilirsiniz.

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


Ne yazık ki bu hala kaputun altında normal çıkış kancaları kullanıyor.
14:47

0

Arama motorlarından buraya gelen diğer kullanıcılar oturum kapatma kancası kullanmayı umursamıyorlarsa, örneğin:

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

Sonra bir ~/.logouthooksonraki çıkışınızda çalıştırılır.

LogoutHookAnahtarın değeri, bir kabuk komutu değil, yürütülebilir bir yol olmalıdır. defaultsKomut değiştirir /var/root/Library/Preferences/com.apple.loginwindow.plist.


Yine de alternatif olarak verdiğiniz için teşekkürler, ancak endişem, giriş ve çıkış kancalarının OS X'in son birkaç sürümü için kullanımdan kaldırılmış olması; Her ne kadar Yosemite'de çalıştıklarını beklesem de (çoğunlukla UI ve Süreklilik değişikliklerine odaklandığından), eski başlangıç ​​öğelerinin değiştirildiği gibi herhangi bir zamanda gidebileceği gibi görünüyor launchd, sadece sahip olmadığı bir utanç RunBeforeUnloadveya benzer seçenek .
Haravikk

0

Launchd oturum kapatma öğesini de 10.10.1'de çalıştıramadım, ancak root'un "com.apple.loginwindow.plist" deki LogoutHook anahtarı iyi çalışıyor. Launchd yöntemi için başka örnekler var mı?

Her neyse, çıkışta sistem hacmini öldürmek için bir AppleScript yazdım, böylece başlangıç ​​zil sesi bir sonraki açılışta duyulmayacak. Ne işe yaramadım, tek bir LogoutHook anahtarına dayalı birden fazla oturum kapatma komutunu yönetmek veya birden fazla LogoutHook anahtarını saklamanın mümkün olup olmadığı ayrıntıları, bu yüzden hala Lingon ile yönetilebilen Launchd yöntemiyle ilgileniyorum, hatta orijinalinden çok daha dar bir kapsama sahip olan Lingon 3 bile (muhtemelen App store'da var).

current_Vol öğesini (kabuk betiği "osascript -e \" çıktı ses düzeyi (ses düzeyi ayarlarını al) \ "" olarak ayarlayın)
{ekran iletişim kutusu "Ekran iletişim kutusu" Başlangıç ​​zilini susturmak, geri yüklemek mi yoksa iptal etmek mi istersiniz? "düğmeleri {" Sessiz "," Geri yükle "," İptal "} varsayılan düğme 1)" sessiz "
    kabuk komut dosyası yap "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# çıkış betiği
osascript -e \ "ses seviyesini ayarla 0 \" '> / usr / local / logouttask / logoutscript; sudo varsayılanları com.apple.loginwindow yazın LogoutHook / usr / local / logouttask / logoutscript; chmod + x / usr / local / logouttask / logoutscript "yönetici ayrıcalıklarına sahip
Başka
    Deneyin
        kabuk komut dosyası yapmak "sudo defaultults com.apple.loginwindow yazmak LogoutHook ''; rm / usr / local / logouttask / logoutscript" yönetici ayrıcalıklarıyla
        iletişim kutusu "Kapatma veya yeniden başlatma sırasında ses seviyesi ayarı 0'dan büyükse başlangıç ​​zil sesi duyulacaktır." düğmeler {"OK"} varsayılan düğme 1
    hata durumunda error_message numarası error_number
        hata_sayısı 1 ise
            "İletişim oturumunda sistem sesini sıfıra ayarlayan komut dosyası yok. Kapatma veya yeniden başlatma sırasında ses düzeyi ayarı 0'dan büyükse başlangıç ​​zil sesi duyulacaktır." düğmeler {"OK"} varsayılan düğme 1
        Başka
            "Hata:" iletişim kutusunu ve hata_sayısını & "." & hata_iletisi düğmeleri {"Tamam"} varsayılan düğmesini göster 1
        eğer biterse
    son denemek
eğer biterse

Çıkış yapmayı nasıl çağırıyorsunuz? Benim örnek kabuk komut dosyası için doğrudan çağrılması gerekir (hiçbir faydası sh) bu yüzden yürütülebilir bir dosya olması gerekir, cevabımda bunu not edeceğim.
Haravikk

Güncelleme için teşekkürler. En kısa zamanda deneyeceğim ve size haber vereceğim.
Kafes

Sadece Terminal'de çağıran plist üzerinde "launchctl unload" komutunu çalıştırarak foo.sh dosyasındaki olayı tetikleyebilirim. Oturumu kapatmak bunu tetiklemez.
Kafes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.