Me parece que el error de los permisos es sólo un síntoma de un problema mucho más profundo: estás intentando cargar el elemento en el lugar equivocado contexto de arranque de la máquina . Específicamente, estás ejecutando el comando launchctl como xyz, pero está tratando de cargar el elemento en el contexto de Root, que xyz no tiene permisos para hacer. Lo que usted quiere es cargar el elemento en el contexto de xyz en su lugar (lo que xyz debería tener permisos para hacer).
Ok, déjame retroceder un poco, y darte un resumen de la jerarquía de launchd en OS X. Cuando el SO arranca, inicia una instancia maestra de launchd (el launchd del "sistema"), que carga elementos de las distintas carpetas Library/LaunchDaemons.
Cuando un usuario se conecta (o inicia una "sesión"), se crea un nuevo "contexto de arranque", se inicia una nueva instancia de launchd (el launchd del "usuario") (en ese nuevo contexto) que carga elementos de las distintas carpetas Library/LaunchAgents (todo dentro de ese nuevo contexto).
Cuando se utiliza sudo -u xyz ...
, cambia los ID de usuario a xyz, pero no cambia al contexto de xyz.
Ahora, hay un par de casos aquí: primero, si xyz no está conectado (es decir, no tiene una sesión activa), no tiene un contexto de arranque o una instancia de launchd, por lo que no puede cargar un LaunchAgent como ellos. Básicamente, los LaunchAgents se cargan en las sesiones de los usuarios, así que si no hay sesión no hay nada que cargar. Por otro lado, esto no debería ser un problema: la próxima vez que xyz inicie sesión, su elemento se cargará automáticamente (siempre que esté en el lugar correcto).
Si xyz es conectado, puedes obtener el ID de proceso de algún proceso dentro de su sesión, y utilizar launchctl bsexec
para cambiar al contexto de arranque de ese proceso (y luego usar sudo -u xyz
para cambiar los UID a xyz, y luego cargar el artículo):
loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \$2;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist