←→ 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/>
| Clave | Efecto | Lo que ves |
|---|---|---|
RunAtLoad | Inicia 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 = true | Reinicia el proceso cada vez que termina | Forzar la salida no sirve de nada; vuelve en segundos |
KeepAlive con condiciones | Reinicia solo en algunos casos, como tras un fallo (SuccessfulExit = false) o mientras haya red | Vuelve a veces, no siempre |
StartInterval | Se ejecuta cada N segundos | Aparece, se ejecuta un momento, desaparece y se repite |
StartCalendarInterval | Se ejecuta a horas fijas, como cron | Aparece todos los días a la misma hora |
WatchPaths | Se ejecuta cuando cambia un archivo o una carpeta | Aparece 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
- Abrir al iniciar sesión. La app está en Ajustes del Sistema › General › Ítems de inicio y extensiones. macOS la abre en cada inicio de sesión.
- Volver a abrir las ventanas al volver a iniciar sesión. Esta casilla del cuadro de diálogo de Reiniciar y Apagar restaura todas las apps que estaban abiertas.
- La app se vuelve a añadir sola. Su propio ajuste «Iniciar con la sesión» la vuelve a registrar cada vez que se ejecuta.
- Un proceso auxiliar abre la app principal. Un pequeño proceso auxiliar en segundo plano se inicia primero y luego abre la app completa, por ejemplo para mostrar el estado de la sincronización.
- Servicios de Homebrew.
brew services startescribe un agente de lanzamiento conRunAtLoad. Detenlo conbrew services stop <name>.
Averigua cuál es
- 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. - Lee la tarea:
Buscalaunchctl print gui/$(id -u)/com.example.helperpath(el archivo plist),state,runs(cuántas veces se ha iniciado) ylast exit code. Un número de ejecuciones alto suele indicarKeepAlive. - Abre el plist y comprueba
RunAtLoad,KeepAlivey las claves de intervalo. - 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 proceso | Sí: enseguida con KeepAlive, en el próximo inicio de sesión con RunAtLoad |
launchctl bootout gui/$(id -u)/label | Ahora no. Sí en el próximo inicio de sesión con RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | No, hasta que ejecutes launchctl enable |
| Sacar el plist de LaunchAgents + bootout | No, hasta que lo vuelvas a poner |
| Desactivarla en Permitir en segundo plano | No, 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.