2010-03-25 29 views
4

J'ai un démon de lancement qui fonctionne dans le contexte de connexion d'une machine Mac OSX 10.6. Je souhaite lancer un agent pour chaque utilisateur à partir de cet agent et exécuter l'agent dans le contexte de connexion de l'utilisateur. Cependant, je dois contrôler très soigneusement les arguments précis de l'application agent, ce qui explique pourquoi je ne peux pas utiliser un agent launchd, comme je l'ai fait pour le démon.Démarrage de l'agent à partir du démon dans le contexte utilisateur

Comment puis-je créer un processus qui s'exécute dans le contexte de l'utilisateur connecté? J'ai trulé seteuid et setuid appels, mais ceux-ci ne changent pas le contexte d'exécution de l'application de l'agent. Je sais que ce n'est pas la manière recommandée par Apple de faire les choses, mais je n'ai pas vraiment le choix - la conception de l'application démon est assez rigide (elle doit traverser plusieurs systèmes). Existe-t-il une solution de contournement qui me permet d'exécuter une application dans le contexte GUI d'un utilisateur connecté, à partir d'un démon qui s'exécute dans le contexte de connexion? J'utilise C++, Carbon & Cocoa.

Répondre

0

Utilisez l'agent launchd. Toutes les autres façons vont faire exploser votre esprit avec des tonnes de détails inutiles et des astuces cachées. En général, il s'agit d'une tâche très complexe avec de nombreux cas de coin et est très difficile à mettre en œuvre correctement. L'agent Launchd vous permettra de vous concentrer sur votre tâche et d'économiser beaucoup de temps. La meilleure solution pour vous est de réécrire l'agent pour ne pas utiliser la ligne de commande, mais pour vous connecter au démon launchd et demander les options/paramètres appropriés. Si ce n'est pas possible ou difficile, vous pouvez écrire à l'agent wrapper launchd qui commencera à se connecter au démon, demander des options, puis lancer l'agent original avec la ligne de commande appropriée. Si vous pensez que c'est trop difficile à implémenter "connecter au démon" machines ... c'est peut-être, mais il est beaucoup plus facile que l'agent de lancement dans une autre session de démon (lorsqu'il est mis en œuvre avec des cas de coin différentes) .

Mais si votre vraiment-vraiment-aucun-matière-ce que vous voulez de manière sale, vous pouvez jouer avec "launchctl bsexec". Un exemple qui fonctionne: Starting/stopping a launchd agent for all users with GUI sessions (au lieu de "launchctl load" il peut lancer n'importe quel exécutable dans un contexte de session).

Une mise à jour à ce sujet.

par « jouer avec launchctl bsexec » Je veux dire quelque chose comme ça:

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

Trouver une application en session que vous voulez, prendre son PID et appelle « launchctl bsexec » pour exécuter ce que vous voulez dans la même session. L'exemple ci-dessus lancera TextEdit dans la session "utilisateur" connectée même si cette ligne est exécutée sous un autre compte d'utilisateur connecté ou de service. Mais je l'ai testé sur Lion - cela ne fonctionne pas. Cela fonctionne seulement pour Léopards (10.5/10.6) pour moi. Ce que j'ai essayé de dire - ne pas utiliser d'agents de lancement causera une douleur constante dans le cul et rien d'autre. Après douzaine de ces choses que nous mis entirly sur les agents de lancement et sont heureux maintenant :)

+0

Pouvez-vous commenter ce que vous avez fait pour passer entièrement à lancer des agents? Parce que je suis en utilisant un agent de lancement que je veux commencer après l'installation, mais que l'installation (plus précisément, le script après le vol) est en cours d'exécution en tant que root. L'angle bsexec utilisé pour démarrer l'agent de lancement comme vous l'avez noté, mais pas dans Lion. Comment lancez-vous votre agent de lancement en premier lieu pour chaque utilisateur connecté? – devguydavid

+0

ps aux | grep loginwindow.app | grep -v grep | awk '{system ("sudo launchctl bsexec" $ 2 "sudo -u" $ 1 "launchctl charger -S Aqua /Library/LaunchAgents/com.my.agent.plist")}' –

+0

Mais cela a un problème avec Lion si vous voulez pour montrer une interface utilisateur. Nous ne le résolvons pas encore. –