1 votos

¿Cómo puedo hacer que un LaunchDaemon ejecute una aplicación al iniciar la sesión?

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>

3voto

eckenrod Puntos 118

@Wowfunhappy La sugerencia de 's para utilizar un gancho de inicio de sesión me consiguió el comportamiento exacto que quería, incluso si no se hizo a través de un LaunchDaemon como estaba previsto. La solución:

Un script (myscript.sh) para lanzar mi aplicación (debe ser ejecutable mediante chmod a+x)

#!/bin/bash

//launch app in background (otherwise login hangs)
/path/to/myapp.app/Contents/MacOS/myapp &

Y especificando ese script como gancho de inicio de sesión a través del comando:

sudo defaults write com.apple.loginwindow LoginHook /path/to/myscript.sh

Mi aplicación ahora se ejecuta como Root en cada inicio de sesión del usuario

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X