Схоже, Apple не зацікавлена в заміні гака виходу, оскільки вони закрили мою проблему, запитуючи про одну.
Однак одне з удосконалень Yosemite полягає в тому, що запущений зараз належним чином передає сигнали до скриптів оболонки. Це означає, що тепер ви можете виконувати такі завдання, як:
Ось приклад 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 ;'
(з могилою до напівколонки)