Tengo una aplicación MacOS mantenida internamente para mi entorno empresarial basado en MacOS Catalina que:
- Debe ejecutarse como Root (accede a una API de dispositivo privilegiada)
- Se ejecuta en segundo plano sin una interfaz de usuario (a través de la clave LSUIElement establecida como verdadera en su Info.plist)
- Debe ejecutarse para cada usuario que inicie sesión en una estación de trabajo sin configuración manual (por ejemplo, sin configuración manual de elementos de inicio de sesión)
La creación de un LaunchDaemon para lanzar la aplicación parecía ser la forma correcta de lograrlo. Sin embargo, el proceso de la aplicación se encuentra colgado después del primer inicio de sesión del usuario, presumiblemente porque intenta iniciarse demasiado pronto antes de que las bibliotecas que soportan la aplicación/ventana estén disponibles (pensé que establecer LSUIElement a true evitaría esto, pero supongo que no. Si hay otra configuración de Info.plist para la aplicación que debería usar para lograr esto, soy todo oídos). No hay errores relacionados con el proceso o el servicio launchd observados en system.log.
He observado tras el inicio de sesión que si mato el proceso colgado y el LaunchDaemon lo reinicia, entonces funciona bien. Por lo tanto, todo lo que creo que necesito es una manera de configurar mi plist LaunchDaemon para que el LaunchDaemon sólo lanza la aplicación en el inicio de sesión del usuario como un LaunchAgent, (que no puedo usar porque LaunchAgents no puede ejecutar como Root). ¿Alguien tiene una configuración plist probada y verdadera que logre esto? ¿Tal vez mediante el establecimiento de un determinado WatchPath para el LaunchDaemon?
Mi lista actual:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.app</string>
<key>ProgramArguments</key>
<array>
<string>/Library/mydaemons/myapp.app/Contents/MacOS/myapp</string>
</array>
<key>KeepAlive</key>
<true/>
</dict>
</plist>