Necesito poder iniciar/detener un agente de GUI por sesión desde un daemon de nivel de raíz.Iniciar/detener un agente de inicio para todos los usuarios con sesiones de GUI
Se discuten los problemas similares here, here y here.
Lo que yo quiero ser capaz de hacer es básicamente
for num in `ps ax | grep [s]bin/launchd | cut -c 1-5`;
do
if [ $num -ne 1 ];
then
sudo launchctl bsexec $num launchctl (un)load -S Aqua /Library/LaunchAgents/com.mycompany.mydaemon.plist;
fi;
done
pero esto sólo se inicia/detiene una instancia y se ejecuta como root en la sesión de interfaz gráfica de usuario actual. Si dejo el sudo fuera allí comenzar consigo
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right
He intentado jugar un poco con una variedad de otras permutaciones de bsexec (incluyendo llama a un script secundaria de bsexec con la carga/descarga de comandos), pero no puedo nunca haga que la instancia comience como otra cosa que no sea root y nunca en otra sesión GUI.
También intenté meterme con su - <user> ...
y sudo -u <user> ...
, pero tampoco tuve suerte (como mucha gente ha discutido en los artículos vinculados anteriormente y en otros lugares).
¿Alguien tiene alguna idea?
EDIT: He intentado hacer esto con una herramienta envoltorio como se sugiere a continuación por Graham Lee, pero me sale el siguiente error:
launch_msg(): Socket is not connected
Este es el comando de línea de comandos, envoltura, y el guión que estoy usando (501 es el ID de usuario y 63093 el pid de launchd para otro usuario conectado al sistema):
línea de comandos:
sudo launchctl bsexec 63093 /path/TestSetUIDAndExecuteTool 501 /path/LoadBillingDialogAgent
Wrapper:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
if (argc != 3) {
NSLog(@"Tool called with improper arguments");
return -1;
}
int uid = [[NSString stringWithUTF8String:argv[1]] intValue];
// TODO: REMOVE
NSLog(@"Setting uid to |%i|", uid);
setuid(uid);
// TODO: REMOVE
char *command = (char *)argv[2];
NSLog(@"Executing command |%s|", command);
system(command);
[pool drain];
return 0;
}
Guión:
/bin/launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist
Cuando hago esto (vea la herramienta de edición con la herramienta de envoltura anterior), aparece el error 'launch_msg(): Socket is not connected' –
¿Debo soltar el UID de la misma manera? –
En realidad, pensé en esto. Parece que el entorno de prueba que había configurado no era lo mismo que un daemon de nivel raíz verdadero. Gracias por la ayuda. –