←→ Underneath: Background Apps · Todas las guías para Mac

Por qué una app vuelve después de reiniciar el Mac

Saliste de ella. Incluso forzaste su salida en Monitor de Actividad. Dos segundos después, o tras el siguiente reinicio, vuelve a estar en ejecución. Algo la está iniciando a propósito. En un Mac, ese algo es casi siempre launchd.

Respuesta corta: la app tiene una tarea de launchd. RunAtLoad la inicia en cada inicio de sesión, y KeepAlive la vuelve a iniciar cada vez que se detiene. Cerrar el proceso no cambia la tarea. Para detenerla definitivamente, desactiva la tarea, no el proceso.

Qué es launchd

launchd es el primer proceso que inicia macOS (ID de proceso 1). Inicia casi todo lo demás. Lee pequeños archivos .plist, llamados tareas (jobs), que indican qué ejecutar y cuándo. Cada tarea tiene una etiqueta (label), un nombre único como com.google.keystone.agent.

Las apps instalan tareas en ~/Library/LaunchAgents, /Library/LaunchAgents o /Library/LaunchDaemons, o las registran desde su propio paquete.

Las claves que hacen volver una app

Este es un agente de lanzamiento típico:

<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
  <string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
ClaveEfectoLo que ves
RunAtLoadInicia la tarea en cuanto se carga, es decir, en cada inicio de sesión (agentes) o en cada arranque (daemons)Está ahí después de cada reinicio
KeepAlive = trueReinicia el proceso cada vez que terminaForzar la salida no sirve de nada; vuelve en segundos
KeepAlive con condicionesReinicia solo en algunos casos, como tras un fallo (SuccessfulExit = false) o mientras haya redVuelve a veces, no siempre
StartIntervalSe ejecuta cada N segundosAparece, se ejecuta un momento, desaparece y se repite
StartCalendarIntervalSe ejecuta a horas fijas, como cronAparece todos los días a la misma hora
WatchPathsSe ejecuta cuando cambia un archivo o una carpetaAparece después de que hagas algo que no tiene relación

launchd espera unos 10 segundos entre reinicios de una tarea que no deja de terminar, así que una tarea con KeepAlive también puede parecer que «parpadea».

Otros motivos por los que vuelve una app

Averigua cuál es

  1. Busca la etiqueta de la tarea. Ejecuta launchctl list | grep -i example, con parte del nombre de la app o del desarrollador. La tercera columna es la etiqueta.
  2. Lee la tarea:
    launchctl print gui/$(id -u)/com.example.helper
    Busca path (el archivo plist), state, runs (cuántas veces se ha iniciado) y last exit code. Un número de ejecuciones alto suele indicar KeepAlive.
  3. Abre el plist y comprueba RunAtLoad, KeepAlive y las claves de intervalo.
  4. Si no hay ninguna tarea, revisa Abrir al iniciar sesión y los ajustes de la propia app.

Detener o desactivar

Lo que haces¿Vuelve?
Salir o forzar la salida del procesoSí: enseguida con KeepAlive, en el próximo inicio de sesión con RunAtLoad
launchctl bootout gui/$(id -u)/labelAhora no. Sí en el próximo inicio de sesión con RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNo, hasta que ejecutes launchctl enable
Sacar el plist de LaunchAgents + bootoutNo, hasta que lo vuelvas a poner
Desactivarla en Permitir en segundo planoNo, hasta que la vuelvas a activar

Los comandos paso a paso están en cómo desactivar agentes de lanzamiento sin riesgo.

FAQ

¿Por qué un proceso se reinicia justo después de cerrarlo en Monitor de Actividad?

Su tarea de launchd tiene KeepAlive activado. launchd vigila el proceso y lo vuelve a iniciar cuando termina. Detén la tarea con launchctl bootout en lugar de cerrar el proceso.

¿Qué significa RunAtLoad?

RunAtLoad es una clave de un plist de launchd. Cuando vale true, launchd inicia la tarea en cuanto carga el plist, lo que en un agente de lanzamiento significa cada vez que inicias sesión.

¿Qué significa KeepAlive?

KeepAlive le indica a launchd que mantenga la tarea en ejecución. Si el proceso termina o se mata, launchd lo vuelve a iniciar. También puede ser un conjunto de condiciones, como reiniciar solo tras un fallo.

¿Qué diferencia hay entre detener y desactivar un agente de lanzamiento?

Detener (launchctl bootout) descarga la tarea hasta el próximo inicio de sesión o reinicio. Desactivar (launchctl disable, o sacar el plist de LaunchAgents) impide que se vuelva a cargar después de reiniciar.