MacOSX(Yosemite)でシステム終了をフックする
Mac OSXのログアウトのフックを実現したくて、launchdを使ってbashのプロセス常駐させてtrapしたけど、blockせずにログアウトしていった。 非常に味わい深い。
LoginHook、LogoutHookを使ってscript走らせればいいじゃんってドキュメントはいっぱい見つかるんだけど、2014年の9月頃にはすでにdeprecatedだって言われてて、Launch Daemons、Launch Agentsを使ってくれよなってAppleのドキュメントは言ってる。
Daemons and Services Programming Guide: Customizing Login and Logout
ただ、最初に言ったようにblockせずにソッ閉じされる。
解決方法
AppleScriptは実は簡単にApplicationにできる。 普通にdialogとか出すだけでも可能っぽい。 AppleScript Editorでnotification出すコードを書いて保存時にFile FormatをApplicationにすればいい。
そこで、AppleScriptでApplicationを作って、StartupItemsに登録して、常駐させることにした。 ログアウト時にはApplictionの終了イベントが来るはずで、夜フクロウとか使ってる人は分かると思うけど、終了時にダイアログが出てログアウトをblockする。 なので、Applicationに終了イベントをフックする処理をAppleScriptで書いて、ダイアログを出すようにした。
on quit display dialog "退勤すんの?" buttons {"Yes", "Not yet"} default button "Not yet" if button returned of result is "Yes" then --change next row. do shell script "/usr/bin/say goodbye" continue quit else if button returned of result is "Not yet" then continue quit end if end quit
アプリを作ってgithubに上げといたから、使いたければ使ってください。 アプリ自体は2014年の9月頃に作ったものだけど、Yosemiteでも問題なく動いてるぞい。