ログアウトフックを使用せずにログアウト時にスクリプトを実行する


11

私はユーザーがログアウトするときにいくつかのクリーンアップコマンドを実行することを検討してきましたが、古いログアウトフック機能はまだ機能していますが、しばらくの間非推奨になっているため、ずっと長くはないかもしれません。

残念ながら、launchdログインフックの便利な代替手段を提供しますが、ログアウトフックに代わる明確な代替はありません。

ログイン時に起動するシェルスクリプトを作成する実験はすでに行っており、killシグナルが受信されるまでスリープ状態になりますが、これは機能していないようです(通常の操作中にスクリプトがシグナルを受信することはありません)。

それ以外の場合、ログアウト時にクイックコマンドを実行する最良の方法は何でしょうか?私はそれを行うことができるいくつかのサードパーティのユーティリティがあることを知っていますが、これを行う「正しい」方法はもうありますか?

回答:


7

Appleはログアウトフックの交換に関心がないようです。ログアウトフックの交換について問い合わせたところ、問題が解決したためです。

ただし、Yosemiteの改善点の1つは、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

これは、トラップされた信号の1つを受信するまで単純にスリープ状態になります(非同期でアンパサンドなしで同期を実行することはできません)onLogout。その時点で関数が実行されます。

必要なことは、RunAtLoad起動エージェントまたは起動デーモンを使用してそのスクリプトを起動することであり、ログアウトまたはシャットダウン時に実行されますが、タスクが終了するまでに完了する時間は限られていることに注意してください。 、これは、時間がかかるものや、遅延する可能性のあるネットワーク接続が必要なものの実行には使用しないでください。

もちろん、これは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、2015年

launchctlを使用してアンロードするとトリガーされますが、ログアウトまたは再起動するとトリガーされません。どうして?
Trellis、2015年

ネットワークがダウンする前にそれを実行する方法はありますか?
filippo 2018

2

iHookを使用して、ログイン/ログアウトフックを実行できます。これは、ヨセミテのBashとPythonで記述された非対話型のログインフックとログアウトフックで引き続き機能することがわかっています。

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


残念ながら、これは内部で通常のログアウトフックを使用しています。
0942v8653 14年

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


とにかく代替としてそれを与えてくれてありがとう、しかし私の懸念はログインとログアウトのフックがOS Xの最後のいくつかのバージョンで廃止されていることです。私はヨセミテで、彼らはまだ機能(それは主にUIと継続性の変化に焦点を当てていますので)期待するが、それはいつでも行くことができるようにそれは古いスタートアップ項目が置き換えられるように、思えるlaunchdちょうどそれが持っていない恥、RunBeforeUnloadまたは同様のオプション。
Haravikk 2014年

0

10.10.1ではlaunchdログアウト項目も機能しませんが、ルートの「com.apple.loginwindow.plist」のLogoutHookキーはうまく機能します。launchdメソッドの他の例はありますか?

とにかく、ログアウト時にシステムボリュームを強制終了するAppleScriptを書いたので、次回の起動時に起動音が聞こえなくなりました。私が理解していないのは、単一のLogoutHookキーに基づいて複数のログアウトコマンドを管理するための詳細、または複数のLogoutHookキーを格納することが可能かどうかであり、Lingonで管理できるLaunchdメソッドにまだ興味があります。または、Lingon 3でさえ、オリジナルよりもはるかに範囲が狭い(おそらくApp Storeに存在すると思われます)。

current_Volを(do shell script "osascript -e \" output volume of(get volume settings)\ "")に設定します
ボタンが返された場合(表示ダイアログ「起動チャイムを消音にしますか、それを元に戻しますか、それともキャンセルしますか?」ボタン{「無音」、「復元」、「キャンセル」}デフォルトボタン1)が「無音」の場合
    シェルスクリプトを実行します "mkdir -p / usr / local / logouttask; echo '#!/ bin / bash
#ログアウトスクリプト
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 "管理者権限で
そうしないと
    試す
        管理者権限でシェルスクリプト「sudo defaults write com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript」を実行する
        表示ダイアログ "シャットダウン時または再起動時に音量設定が0より大きい場合、起動音が聞こえます。" ボタン{"OK"}デフォルトボタン1
    エラー時にerror_message番号error_number
        error_numberが1の場合
            表示ダイアログ "ログアウト時にシステムボリュームをゼロに設定するスクリプトは存在しません。シャットダウンまたは再起動時にボリューム設定が0より大きい場合、起動音が聞こえます。" ボタン{"OK"}デフォルトボタン1
        そうしないと
            表示ダイアログ "Error:"&the error_number& "。"&the error_message buttons {"OK"} default button 1
        終われば
    試してみる
終われば

ログアウト項目をどのように呼び出しますか?私のサンプルシェルスクリプトは直接呼び出す必要がある(を使用しないsh)ため、実行可能なファイルである必要があります。これについては、私の回答で説明します。
Haravikk、2015年

更新していただきありがとうございます。私はできるだけ早く試みて、あなたに知らせます。
Trellis、2015年

ターミナルでそれを呼び出すplistで "launchctl unload"を実行することによって、foo.shに含まれるイベントのみをトリガーできます。ログアウトしてもトリガーされません。
Trellis、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.