Кажется, что Apple не заинтересована в замене хука выхода из системы, так как они закрыли мою проблему, спрашивая об одном.
Однако одно из улучшений в Yosemite заключается в том, что 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
Это будет просто спать (асинхронно, синхронно, без амперсанда, кажется, не работает), пока не получит один из захваченных сигналов, после чего он выполнит onLogout
функцию.
Все, что вам нужно сделать, это запустить этот сценарий с помощью RunAtLoad
агента запуска или запускающего демона, и он будет работать при выходе из системы или завершении работы, хотя важно помнить, что для выполнения задач требуется лишь ограниченное количество времени, прежде чем они будут уничтожены. поэтому его нельзя использовать для запуска чего-либо, что занимает много времени или требует подключения к сети, которое может быть отложено и т. д.
Конечно, это никому не нужно на Mavericks или ранее, но при Yosemite это теперь, кажется, работает как ожидалось; так что я делал все правильно, во-первых, 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 ;'
(с могилой перед точкой с запятой)