Cómo usar Launchd para programar scripts en Mac

Automatizar tareas programando scripts es una capacidad poderosa de la que muchos administradores dependen todos los días. Los usuarios regulares de Mac también pueden aprovechar este poder utilizando launchd, la herramienta preferida de Apple para la automatización y gestión de tareas en macOS. Desde programar tareas simples como desactivar Wi-Fi a una hora específica, hasta ejecutar copias de seguridad del sistema complejas, launchd en Mac puede ayudarte a automatizar tus flujos de trabajo, ahorrar tiempo y asegurarte de que tu sistema funcione justo como te gusta.
Tabla de Contenidos
- ¿Qué es Launchd?
- Daemons y Agentes
- Escribiendo Scripts
- Descripciones de Trabajo
- Cargando trabajos en launchctl
- Preguntas Frecuentes
¿Qué es Launchd?
Así como una orquesta requiere un director para guiar y armonizar los diversos instrumentos, macOS Ventura, con su miríada de procesos y servicios, depende de launchd para asegurar que todo suene en perfecta armonía. Como el primer proceso lanzado por el núcleo de macOS cuando inicias tu computadora, launchd ocupa el centro del escenario, orquestando cada proceso, servicio y aplicación subsiguiente, al igual que un director señalando el comienzo de una sinfonía con el primer levantamiento de la batuta.
Más allá de su papel en la orquestación del sistema, launchd puede ser utilizado para programar scripts, una serie de comandos escritos para realizar una tarea específica. Esto se hace utilizando el comando launchctl, que sirve como la interfaz para que los usuarios se comuniquen y dirijan al director que es launchd.
Bueno saber: ¿descargando torrents? Mejora la eficiencia descargando torrents con Terminal en tu Mac.
Daemons y Agentes
launchd a veces se refiere a un daemon, un programa informático que se ejecuta como un proceso en segundo plano y que típicamente no está diseñado para ser controlado directamente por un usuario. En lo que respecta a los daemons, launchd es especial, ya que es el maestro de todos los demás daemons de macOS, y puede decidir cuándo comienzan y se detienen. Estos daemons subordinados se ejecutan bajo el usuario root, por lo que pueden hacer prácticamente cualquier cosa.

Sin embargo, como usuario interesado en la programación de tareas, ejecutar scripts bajo el usuario root no siempre es deseable o necesario. Aquí es donde entran en juego los agentes. Los agentes se ejecutan en nombre de un usuario conectado, ofreciendo un entorno más restringido y asegurando que los scripts o tareas se realicen con los permisos y preferencias de ese usuario específico. Por ejemplo, si deseas que un script se ejecute que cambie configuraciones o acceda a archivos dentro de tu cuenta, deberías usar un agente.
Consejo: ¿tienes problemas de compatibilidad con algunas de tus aplicaciones de Mac favoritas? Descubre cómo instalar Linux de 32 bits en un viejo Mac.
Escribiendo Scripts
Para ejecutar agentes o daemons a través de launchd, necesitarás escribir algunos scripts. El lenguaje de scripting más común es bash. Si deseas aprender más sobre scripting en bash, puedes consultar nuestra guía para principiantes sobre scripting en bash.

Tus scripts de launchd pueden vivir en dos ubicaciones diferentes, dependiendo de si están destinados a ejecutarse como agentes o daemons:
- Para aquellos scripts destinados a ser agentes, actuando en nombre del usuario conectado, deben almacenarse en “~/Library/LaunchAgents.”
- Por el contrario, los scripts destinados a funcionar como daemons, operando a nivel del sistema independientemente del usuario conectado, pertenecen a “/Library/LaunchDaemons.”
Recuerda, los agentes no tienen permisos de root, por lo que no pueden realizar tareas que requieran acceso profundo al sistema. Los daemons, por otro lado, se ejecutan con permisos de root y pueden manejar tareas que afectan a todo el sistema.
Bueno saber: puedes obtener un control más profundo sobre tu Mac habilitando el Usuario Root, lo que te permite acceder a todo su sistema de archivos.
Descripciones de Trabajo

Los scripts en launchd son activados por definiciones de trabajo, que son archivos .plist almacenados en directorios específicos. Estos archivos XML le dan un nombre al trabajo, especifican el script que debe ser lanzado e indican cuándo debe ejecutarse el script. Una vez que hayas escrito tu script, deberás escribir y cargar una definición de trabajo que lance el script en el momento apropiado. Una definición de trabajo se ve algo así:
version="1.0"encoding="UTF-8"?>
version="1.0">
>
>Label>
>local.restart>
>Program>
>/Users/user/Scripts/restart.sh>
>RunAtLoad>
/>
>
>Modifica según sea necesario, luego colócalo en un archivo de texto con la extensión .plist antes de colocarlo en el directorio correcto (ver arriba).
Hay algunas partes clave en la descripción del trabajo:
- Label: el nombre del trabajo dentro de launchd. Debe ser único para cada trabajo. Estos se escriben en notación de dominio inverso, y “local” es un gran dominio para agentes privados.
- Program: la ruta completa del script que esta descripción de trabajo lanza.
- RunAtLoad: describe cuándo debe ejecutarse el script. Hay algunas opciones diferentes aquí: - RunAtLoad: ejecutar tan pronto como se carga la definición del trabajo. Se ejecuta solo una vez por carga.
- StartInterval: iniciar el trabajo cada n segundos.
- StartCalendarInterval: ejecutar el trabajo en un momento y fecha específicos.
Consejo: ¿necesitas más espacio para esos archivos de script? Aprende cómo limpiar la caché en tu Mac para liberar espacio rápidamente.
Cargando trabajos en launchctl

Una vez que hayas creado tus scripts y guardado tu agente en el lugar correcto, necesitarás cargarlo en launchctl. Esto sucederá automáticamente en los inicios de sesión en el futuro.
Para ver qué se está ejecutando actualmente en launchctl, puedes usar launchctl list en la terminal. Esta gran lista puede ser filtrada para tu script etiquetándolo con algo como lo siguiente:
launchctl list |grep local.restartPara cargar un script, abre Terminal y usa el siguiente comando:
launchctl load ~/Library/LaunchAgents/local.restart.plistPara eliminar el script de la cola de launchctl, usa el comando unload:
launchctl unload ~/Library/LaunchAgents/local.restart.plistCargar un trabajo lo coloca en la cola de launchd, y el trabajo se ejecutará en el momento especificado en sus condiciones de lanzamiento. Si deseas ejecutar un script inmediatamente sin importar qué, deberías usar el comando “start”:
launchctl start local.restartEste comando toma la etiqueta del trabajo y solo funcionará si el trabajo ya ha sido cargado en launchctl.
Consejo: conviértete en un usuario avanzado de Mac utilizando Raycast o Alfred para lanzar rápidamente tus aplicaciones favoritas.
Preguntas Frecuentes
¿Cómo puedo verificar si launchd ha iniciado un script?
Puedes usar el comando launchctl list en la terminal. Esto mostrará todos los trabajos cargados. Para encontrar un script o trabajo específico, usa grep, por ejemplo, launchctl list | grep tu_nombre_de_script.
¿Qué pasa si launchd está usando demasiados recursos del sistema?
Si launchd está consumiendo recursos excesivos, generalmente se debe a un script o trabajo que no se comporta correctamente. Debes revisar los scripts que has agregado recientemente y descargarlos usando launchctl unload /ruta/al/trabajo.plist.
¿Cuál es la diferencia entre cron y launchd?
Tanto cron como launchd son servicios de programación, pero operan de manera diferente. cron es un programador de trabajos más antiguo basado en Unix que ejecuta trabajos en momentos o intervalos fijos definidos en un archivo crontab. launchd es el sistema más nuevo de Apple para macOS que puede iniciar trabajos basados en varios desencadenantes, no solo en el tiempo.
¿Puedo usar otros lenguajes de scripting además de bash con launchd?
launchd puede ejecutar cualquier script que se pueda ejecutar desde la terminal. Esto incluye scripts escritos en Python, Perl, Ruby y otros lenguajes.
Crédito de la imagen: Pexels. Todas las capturas de pantalla por David Morelo.