लॉगआउट हुक पर स्क्रिप्ट का उपयोग करें लॉगआउट हुक के बिना


9

जब कोई उपयोगकर्ता लॉग आउट करता है, तो मैं कुछ क्लीनअप कमांड चलाने पर विचार कर रहा हूं, हालांकि पुराने लॉगआउट हुक फीचर, हालांकि अभी भी कार्य कर रहा है, कुछ समय के लिए पदावनत किया गया है, इसलिए अब हमारे साथ अधिक समय तक नहीं रह सकता है।

दुर्भाग्य से, यद्यपि launchd लॉगिन हुक के लिए एक सुविधाजनक विकल्प प्रदान करता है, लॉगआउट हुक के लिए ऐसा कोई स्पष्ट प्रतिस्थापन नहीं है।

मैंने पहले ही एक शेल स्क्रिप्ट बनाने के लिए प्रयोग किया है जो लॉगिन पर लॉन्च किया गया है, और बस तब तक सोता है जब तक कि एक किल सिग्नल प्राप्त नहीं होता है, हालांकि यह काम नहीं करता है (स्क्रिप्ट सामान्य ऑपरेशन के दौरान संकेत कभी नहीं प्राप्त करता है)।

अन्यथा मुझे यकीन नहीं है कि लॉगआउट पर एक त्वरित कमांड चलाने का सबसे अच्छा तरीका क्या होगा? मुझे पता है कि कुछ तृतीय पक्ष उपयोगिताएं हैं जो इसे कर सकती हैं, लेकिन क्या अब ऐसा करने का एक "सही" तरीका है?

जवाबों:


7

ऐसा लगता है कि Apple एक लॉगआउट हुक रिप्लेसमेंट में दिलचस्पी नहीं ले रहा है, क्योंकि उन्होंने एक के बारे में पूछताछ करते हुए मेरा मुद्दा बंद कर दिया है।

हालांकि, योसेमाइट में सुधार में से एक यह है कि लॉन्चड अब ठीक से शेल स्क्रिप्ट्स को संकेत भेजता है। इसका मतलब यह है कि अब आप लॉग-आउट कार्य कर सकते हैं जैसे:

यहाँ एक उदाहरण 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 लॉन्च एजेंट या लॉन्च डेमन यह एक लंबा समय लगता है, या एक नेटवर्क कनेक्शन की आवश्यकता होती है जिसे विलंबित किया जा सकता है आदि।

बेशक यह मावेरिक्स पर या इससे पहले किसी के लिए कोई फायदा नहीं है, लेकिन योसेमाइट के तहत अब यह उम्मीद के मुताबिक काम कर रहा है; इसलिए मैं वास्तव में इसे पहली जगह में कर रहा था, 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

वूप्स, आप सही हैं @ जैसन, मुझे लगता है कि मैंने इसे बहुत सरल कर दिया है, मैंने इसे अधिक बारीकी से काम करने के उदाहरण के साथ जोड़ दिया है।
Haravikk

यह तब चालू होता है जब मैं इसे लॉन्चक्टल का उपयोग करके अनलोड करता हूं, लेकिन जब मैं लॉग आउट या पुनरारंभ नहीं करता हूं। क्यूं कर?
Trellis

क्या नेटवर्क नीचे जाने से पहले इसे चलाने का कोई तरीका है?
user824963

2

आप लॉगिन / लॉगआउट हुक को चलाने के लिए iHook का उपयोग कर सकते हैं, जो मुझे अभी भी गैर-इंटरैक्टिव लॉगिन और Yosemite पर बैश और पायथन में लिखे गए लॉगआउट हुक के लिए काम करने के लिए मिला है।

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


दुर्भाग्य से यह अभी भी हुड के नीचे सामान्य लॉगआउट हुक का उपयोग करता है।
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


वैसे भी इसे एक विकल्प के रूप में देने के लिए धन्यवाद, लेकिन मेरी चिंता यह है कि ओएस एक्स के पिछले कुछ संस्करणों के लिए लॉगिन और लॉगआउट हुक को हटा दिया गया है; हालांकि मुझे उम्मीद है कि वे अभी भी योसेमाइट में काम कर रहे हैं (क्योंकि यह ज्यादातर यूआई और निरंतरता परिवर्तनों पर केंद्रित है) ऐसा लगता है कि यह किसी भी समय जा सकता है, जैसे पुराने स्टार्टअप आइटम द्वारा प्रतिस्थापित किया जा रहा launchd, बस यह शर्म की बात नहीं है RunBeforeUnload या समान विकल्प।
Haravikk

0

मुझे 10.10.1 में काम करने के लिए लॉन्च लॉगआउट आइटम नहीं मिल सकता है, लेकिन रूट के "com.apple.loginwindow.plist" में LogoutHook कुंजी अच्छी तरह से काम करती है। लॉन्च विधि के लिए कोई अन्य उदाहरण हैं?

फिर भी, मैंने लॉगआउट में सिस्टम वॉल्यूम को मारने के लिए एक AppleScript लिखा है ताकि अगले स्टार्टअप पर स्टार्टअप झंकार नहीं सुनाई देगी। मैंने जो काम नहीं किया है, वह एक लॉगआउटहूक कुंजी के आधार पर कई लॉगआउट कमांड का प्रबंधन करने के लिए विवरण हैं, या क्या कई लॉगआउटहूक कुंजी स्टोर करना संभव है, इसलिए मुझे अभी भी लॉन्चड विधि में दिलचस्पी है, जिसे लिंगोन के साथ प्रबंधित किया जा सकता है, या यहां तक ​​कि लिंगोन 3, जिसमें मूल (ऐप स्टोर में मौजूद होने की तुलना में) की तुलना में बहुत कम गुंजाइश है।

set current_Vol to (do shell script "osascript -e \"output volume of (get volume settings)\"")
if button returned of (display dialog "Do you want to silence the startup chime, restore it, or cancel?" buttons {"Silence", "Restore", "Cancel"} default button 1) is "silence" then
    do shell script "mkdir -p  /usr/local/logouttask;echo '#!/bin/bash
# logout script
osascript -e \"set volume 0\"' > /usr/local/logouttask/logoutscript;sudo defaults write com.apple.loginwindow LogoutHook /usr/local/logouttask/logoutscript;chmod +x /usr/local/logouttask/logoutscript" with administrator privileges
else
    try
        do shell script "sudo defaults write com.apple.loginwindow LogoutHook '';rm /usr/local/logouttask/logoutscript" with administrator privileges
        display dialog "The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1
    on error the error_message number the error_number
        if error_number is 1 then
            display dialog "The script that sets system volume to zero at logout doesn't exist. The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1
        else
            display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
        end if
    end try
end if

आप लॉगआउट आइटम को कैसे आमंत्रित कर रहे हैं? मेरा उदाहरण शेल स्क्रिप्ट को सीधे लागू करने की आवश्यकता है (इसका कोई उपयोग नहीं) sh ) इसलिए इसे एक ऐसी फाइल होना चाहिए जो निष्पादन योग्य हो, मैं अपने उत्तर में ध्यान दूंगा।
Haravikk

अपडेट करने के लिए धन्यवाद। मैं जल्द से जल्द कोशिश करूँगा और आपको बताऊँगा।
Trellis

मैं केवल foo.sh में निहित ईवेंट को ट्रिगर कर सकता हूं जो कि टर्मिनल में "लॉन्चक्टल अनलोड" पर चल रहा है। लॉग आउट करने से यह ट्रिगर नहीं होता है।
Trellis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.