tl; dr: использовать встроенный в OSX модуль запуска и управления процессами launchd
.
Для этого создайте launchctl
демон. Вы будете иметь полный контроль над всеми аспектами сценария. Вы можете запустить один раз или остаться в живых как демон. В большинстве случаев это путь.
- Создайте
.plist
файл в соответствии с инструкциями в документации Apple Dev здесь или более подробно ниже.
- Установить в
~/Library/LaunchAgents
- Войти (или запустить вручную через
launchctl load [filename.plist]
)
Более того launchd
, статья в Википедии довольно хороша и описывает систему и ее преимущества перед другими старыми системами.
Вот конкретный файл plist для запуска скрипта при входе в систему .
Обновлен 2017/09/25 для OSX El Capitan и новее (кредит Хосе Мессиасу-младшему ):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.loginscript</string>
<key>ProgramArguments</key>
<array><string>/path/to/executable/script.sh</string></array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Замените <string>
после ключа программы нужной вам командой (обратите внимание, что любой сценарий, на который ссылается эта команда, должен быть исполняемым: chmod a+x /path/to/executable/script.sh
это должно быть сделано для всех пользователей).
Сохранить как ~/Library/LaunchAgents/com.user.loginscript.plist
Запустить launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist
и выйти / войти, чтобы проверить (или проверить напрямую, запустить launchctl start com.user.loginscript
)
Хвост /var/log/system.log
для сообщений об ошибках.
Ключевым моментом является то, что это запись запуска для конкретного пользователя, поэтому она будет выполняться при входе в систему для данного пользователя. Системные демоны запуска (помещенные в /Library/LaunchDaemons
) запускаются при загрузке.
Если вы хотите, чтобы сценарий запускался при входе в систему для всех пользователей, я полагаю, что LoginHook - ваш единственный вариант, и, вероятно, именно поэтому он существует.