Mi sembra che l'errore delle autorizzazioni sia solo un sintomo di un problema molto più profondo: stai provando a caricare l'elemento nel mach bootstrap context . In particolare, stai eseguendo il comando launchctl come xyz, ma sta cercando di caricare l'elemento nel contesto di root, che xyz non ha i permessi da fare. Quello che vuoi è quello di caricare l'oggetto nel contesto di xyz (che xyz dovrebbe avere il permesso di fare).
Ok, fammi un po 'di backup, e ti do un po' di un riassunto della gerarchia launchd in OS X. Quando il sistema operativo si avvia, avvia un'istanza master di launchd (il "sistema" launchd), che carica elementi dalle varie cartelle Libreria / LaunchDaemon.
Quando un utente effettua l'accesso (o in altro modo avvia una "sessione"), viene creato un nuovo "contesto di bootstrap", viene avviata una nuova istanza di launchd (il "utente" launchd) (nel nuovo contesto) che carica gli elementi dalle varie cartelle Library / LaunchAgents (tutte all'interno di quel nuovo contesto).
Quando usi sudo -u xyz ...
, cambia gli ID utente in xyz, ma non passa al contesto di xyz.
Ora, ci sono un paio di casi qui: in primo luogo, se xyz non è loggato (cioè non ha una sessione attiva), non hanno un contesto bootstrap o un'istanza launchd, quindi puoi ' t carica un LaunchAgent come loro. Fondamentalmente, i LaunchAgent vengono caricati nelle sessioni utente, quindi se non ci sono sessioni, non c'è nulla in cui caricarle. D'altro canto, questo non dovrebbe essere un problema: la prossima volta che xyz si collega, il tuo articolo verrà caricato automaticamente (purché sia nel posto giusto).
Se xyz è loggato, puoi ottenere l'ID di processo di qualche processo all'interno della loro sessione e usare launchctl bsexec
per passare al contesto bootstrap di quel processo (e poi usare sudo -u xyz
per passare UID a xyz e quindi caricare l'elemento):
loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist