запустить агент из демона в контексте пользователя - PullRequest
4 голосов
/ 25 марта 2010

У меня есть демон запуска, который запускается в контексте входа в систему на компьютере Mac OSX 10.6. Я хочу запустить агент для каждого пользователя из этого агента и запустить его в контексте входа пользователя. Однако мне нужно очень тщательно контролировать точные аргументы приложения агента, поэтому я не могу использовать агент launchd, как у меня для демона.

Как я могу создать процесс, который запускается в контексте вошедшего в систему пользователя? Я истолковал вызовы seteuid и setuid, но они не изменяют контекст выполнения приложения агента.

Я знаю, что это не рекомендуемый способ работы Apple, но у меня нет действительно никакого выбора в этом вопросе - дизайн приложения-демона довольно негибкий (он должен работать во многих различных системах ). Есть ли обходной путь, позволяющий мне запускать приложение в контексте графического интерфейса пользователя, вошедшего в систему, из демона, который работает в контексте входа в систему?

Я использую C ++, Carbon & Cocoa.

1 Ответ

0 голосов
/ 04 июля 2011

Использовать агент запуска. Все остальные способы взорвут ваш мозг тоннами бесполезных деталей и скрытых трюков. В общем, это очень сложная задача со многими угловыми случаями, и ее очень трудно правильно реализовать. Агент Launchd позволит вам сконцентрироваться на своей задаче и сэкономить много времени.

Лучшее решение для вас - переписать агент не для использования командной строки, а для подключения к демону launchd и запросить правильные параметры / настройки.

Если это невозможно или сложно, вы можете написать агент запуска оболочки, который при запуске подключится к демону, запросить параметры и затем запустить оригинальный агент с соответствующей командной строкой.

Если вы считаете, что слишком сложно реализовать механизм "подключения к демону" ... возможно, это так, но это намного проще, чем запуск агента в другом сеансе из демона (если реализовано правильно с поддержкой различных угловых случаев).

Но если вы действительно, действительно, неважно, чего хотите, грязно, вы можете поиграть с «launchctl bsexec». Некоторые примеры этой работы: Запуск / остановка агента launchd для всех пользователей с сеансами графического интерфейса пользователя (вместо «launchctl load» он может запустить любой исполняемый файл в контексте сеанса).

Некоторые обновления по этому вопросу.

Под "игрой с launchctl bsexec" я имею в виду нечто подобное:

ps aux | grep loginwindow | grep user | awk '{ system("sudo launchctl bsexec "$2" sudo -u user /Applications/TextEdit.app/Contents/MacOS/TextEdit") }'

Найдите какое-либо приложение в сеансе, который вы хотите, возьмите его PID и вызовите "launchctl bsexec", чтобы запустить то, что вы хотите в том же сеансе. Приведенный выше пример запустит TextEdit в сеансе пользователя, вошедшего в систему, даже если эта строка выполняется под другим пользователем, вошедшим в систему под учетной записью пользователя или из службы.

Но я проверил это на Lion - он не работает. Это работает только для леопардов (10,5 / 10,6) для меня. То, что я пытался сказать, - не использовать агенты запуска, будет вызывать постоянную боль в твоей заднице и больше ничего. После десятка таких вещей мы переключились на агентов запуска и теперь счастливы:)

...