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