Я хотел бы запустить сценарий от имени конкретного пользователя при запуске (не при входе в систему). Я думал, что LaunchDaemon при запуске сделает это, но man launchd говорит:
"Если вы хотите, чтобы ваша служба запускалась от имени определенного пользователя в среде этого пользователя, создание ее агентом launchd является ЕДИНСТВЕННЫМ поддерживаемым средством достижения этой цели в Mac OS X. Другими словами, недостаточно выполнить setuid (2 ), чтобы стать пользователем Mac OS X в прямом смысле слова ».
Они не шутят - когда я пытаюсь запустить свой скрипт как LaunchDaemon, он не работает. В частности, я пытаюсь автоматизировать некоторые операции с связкой ключей с помощью команды security, и она не позволяет мне изменить связку ключей по умолчанию, когда я запускаю сценарий через LaunchDaemon, хотя сценарий отлично работает при запуске с использованием sudo из оболочки.
LaunchAgent не будет работать, потому что цель состоит в том, чтобы процесс запускался без входа пользователя в систему, а LaunchAgents запускаются только тогда, когда кто-то входит в систему. Я посмотрел на cron и директиву @reboot, и это выглядит многообещающе, но я читал, что cron - это устарело в OSX.
У меня были похожие проблемы, пытаясь заставить длительный процесс использовать связку ключей по умолчанию. По сути, LaunchAgent, похоже, не запускается в среде полного входа для выполнения команд безопасности, поэтому изменение связки ключей по умолчанию не работает и возвращается с ошибкой разрешений на /Library/Preferences/
каталог.
Секретный соус - добавить:
<key>SessionCreate</key>
<true/>
в ваш список. Это недокументированная функция, которая создаст правильную среду и позволит вам установить связку ключей по умолчанию. Кредит на Joensson на этот вопрос за то, что указал мне в правильном направлении.
Сохранить как глобальный демон (/Library/LaunchDaemons
) и укажите пользователя ключом UserName
:
<key>UserName</key>
<string>Put username here</string>
Есть ряд других мест где вы можете скрыть элементы автозагрузки в OS X (большинство из которых полностью не поддерживаются). Я бы попробовал /etc/rc.local
; Кажется, я припоминаю, что работал в Panther, так что есть вероятность, что он все еще может работать сегодня.