В OS X вы можете создать предварительно запущенный агент запуска. Например, сохраните этот список свойств как /Library/LaunchAgents/some.label.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>some.label</string>
<key>LimitLoadToSessionType</key>
<array>
<string>LoginWindow</string>
<string>Aqua</string>
</array>
<key>ProgramArguments</key>
<array>
<string>say</string>
<string>a</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Убедитесь, что plist принадлежит root. Если это не так, он может быть загружен, если вы запускаете launchd load от имени пользователя, но он не загружается launchd автоматически.
Затем, если вы перезапустите компьютер, команда say должна быть запущена один раз при отображении окна входа в систему и еще раз после графического входа пользователя.
Если вы не хотите, чтобы программа запускалась снова, когда пользователь входит в систему графически, удалите <string>Aqua</string> .
Если автоматический вход в систему включен, а для LimitLoadToSessionType задано только LoginWindow , программа вообще не запускается.
Обратитесь к технической заметке Daemons and Agents или man launchd.plist для получения дополнительной информации.