Кажется, что 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 ;'
(с могилой перед точкой с запятой)Вы можете использовать iHook для запуска хуков входа / выхода, которые, как я обнаружил, все еще работают для неинтерактивных хуков входа и выхода, написанных на Bash и Python на Yosemite.
http://rsug.itd.umich.edu/software/ihook/
источник
Если другим, кто попадает сюда из поисковых систем, не нужно использовать ловушку выхода из системы, запустите, например:
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
или подобная опция ,Я не могу заставить работать элемент logd запуска в 10.10.1, но ключ LogoutHook в корневом каталоге com.apple.loginwindow.plist работает хорошо. Есть ли другие примеры для метода launchd?
Во всяком случае, я написал AppleScript для уничтожения системного тома при выходе из системы, чтобы при следующем запуске не прозвучал сигнал запуска. Что я не разработал, так это подробности управления несколькими командами выхода из системы на основе одного ключа LogoutHook или возможности хранения нескольких ключей LogoutHook, поэтому я по-прежнему заинтересован в методе Launchd, которым можно управлять с помощью Lingon, или даже Lingon 3, который имеет гораздо более узкую область применения, чем оригинал (предположительно, существует в магазине приложений).
источник
sh
), так что это должен быть исполняемый файл, я отмечу это в своем ответе.