Cómo usar Launchd para programar secuencias de comandos de ejecución en Mac

Cómo usar Launchd para programar secuencias de comandos de ejecución en Mac

La automatización de tareas mediante la programación de scripts es una capacidad poderosa en la que muchos administradores confían todos los días. Los usuarios regulares de Mac también pueden aprovechar este poder usando launchd, la herramienta preferida de Apple para la automatización y administración de tareas en macOS. Desde programar tareas simples como apagar Wi-Fi a una hora específica, hasta ejecutar copias de seguridad complejas del sistema, launchd en Mac puede ayudarlo a automatizar sus flujos de trabajo, ahorrar tiempo y garantizar que su sistema funcione de la manera que le gusta.

¿Qué es Launchd?

Al igual que una orquesta requiere un director para guiar y armonizar los diversos instrumentos, macOS Ventura , con su gran cantidad de procesos y servicios, confía en launchd para garantizar que todo suene en perfecto concierto. Como el primer proceso lanzado por el kernel de macOS cuando enciende su computadora, launchd toma el centro del escenario, orquestando cada proceso, servicio y aplicación subsiguientes, como un director que señala el comienzo de una sinfonía con el levantamiento inicial de la batuta.

Más allá de su rol en la orquestación del sistema, launchd puede usarse para programar scripts, una serie de comandos escritos para realizar una tarea específica. Esto se hace usando el launchctlcomando, que sirve como interfaz para que los usuarios se comuniquen y dirijan el conductor que se lanza.

Demonios y Agentes

launchd a veces se denomina daemon, un programa de computadora que se ejecuta como un proceso en segundo plano y, por lo general, no está diseñado para ser controlado directamente por un usuario. En lo que respecta a los demonios, launchd es especial, ya que es el maestro de todos los demás demonios de macOS y puede decidir cuándo se inician y se detienen. Estos demonios subordinados se ejecutan bajo el usuario raíz, por lo que pueden hacer casi cualquier cosa.

Maxwell Demon Wiki Gráfico
Fuente de la imagen: Wikipedia

Sin embargo, como usuario interesado en la programación de tareas, la ejecución de secuencias de comandos bajo el usuario raíz no siempre es deseable o necesaria. Aquí es donde entran en juego los agentes. Los agentes se ejecutan en nombre de un usuario que ha iniciado sesión, lo que ofrece un entorno más restringido y garantiza que los scripts o las tareas se realicen con los permisos y preferencias de ese usuario específico. Por ejemplo, si desea ejecutar un script que cambie la configuración o acceda a archivos dentro de su cuenta, usaría un agente.

Escritura de guiones

Para ejecutar agentes o demonios a través de launchd, deberá escribir algunos scripts. El lenguaje de programación más común es bash. Si desea obtener más información sobre las secuencias de comandos de bash, puede consultar nuestra guía para principiantes sobre secuencias de comandos de bash .

launchd-code-scriptto

Sus scripts launchd pueden vivir en dos ubicaciones diferentes, dependiendo de si están destinados a ejecutarse como agentes o demonios:

  • Para aquellos scripts destinados a ser agentes, que actúan en nombre del usuario que inició sesión, deben almacenarse en «~/Library/LaunchAgents».
  • Por el contrario, los scripts destinados a funcionar como demonios, en todo el sistema operativo, independientemente del usuario que haya iniciado sesión, pertenecen a «/Library/LaunchDaemons».

Recuerde, los agentes no tienen permisos de raíz, por lo que no pueden realizar tareas que requieran un acceso profundo al sistema. Los demonios, por otro lado, se ejecutan con permisos de root y pueden manejar tareas que afectan a todo el sistema.

Descripciones de trabajo

launchd-scripts-trabajo-descripción

Los scripts en launchd son activados por definiciones de trabajo, que son. plist archivos almacenados en directorios específicos. Estos archivos XML le dan un nombre al trabajo, especifican el script que debe ejecutarse e indican cuándo debe ejecutarse el script. Una vez que haya escrito su secuencia de comandos, escribirá y cargará una definición de trabajo que inicie la secuencia de comandos en el momento adecuado. Una definición de trabajo se parece a esto:

<?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>local.restart</string>
<key>Program</key>
<string>/Users/user/Scripts/restart.sh</string>
<key>RunAtLoad</key>
<true/>
</dict></plist>

Modifique según sea necesario, luego colóquelo en un archivo de texto con la extensión. plist extensión antes de colocarlo en el directorio correcto (ver arriba).

Hay algunas partes clave en la descripción del trabajo:

  • Etiqueta: el nombre del trabajo dentro de launchd. Debe ser único para cada trabajo. Estos están escritos en notación de dominio inverso, y «local» es un gran dominio para agentes privados.
  • Programa: la ruta completa del script que inicia esta descripción de trabajo.
  • RunAtLoad: describe cuándo se debe ejecutar el script. Hay algunas opciones diferentes aquí:
    • RunAtLoad: se ejecuta tan pronto como se carga la definición del trabajo. Funciona solo una vez por carga.
    • StartInterval: inicia el trabajo cada n segundos. Este ejemplo ejecutará el trabajo cada 7200 segundos o cada 2 horas.<key>StartInterval</key> <integer>7200</integer>
    • StartCalendarInterval: ejecuta el trabajo en una fecha y hora específicas. El siguiente código ejecutará el trabajo todos los días a las 9 a.m.<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>

Cargando trabajos en launchctl

launchd-scripts-launchctl-list

Una vez que haya creado sus scripts y guardado su agente en el lugar correcto, deberá cargarlo en un archivo launchctl. Esto sucederá automáticamente en los inicios de sesión en el futuro.

Para ver lo que se está ejecutando actualmente en laucnhctl, puede usar launchctl listen la terminal. Esta lista gigante se puede agrupar para su secuencia de comandos etiquetándola con algo como lo siguiente:

launchctl list | grep local.restart

Para cargar un script, abra Terminal y use el siguiente comando:

launchctl load ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-launchctl-load

Para eliminar el script de la cola de launchctl, use el unloadcomando:

launchctl unload ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-launchctl-descarga

Cargar un trabajo lo coloca en la cola de inicio y el trabajo se ejecutará en el momento especificado en sus condiciones de inicio. Si desea ejecutar un script de inmediato, pase lo que pase, debe usar el comando «iniciar»:

launchctl start local.restart

Este comando toma la etiqueta del trabajo y solo funcionará si el trabajo ya se cargó en launchctl.

Preguntas frecuentes

¿Cómo puedo comprobar si launchd ha iniciado un script?

Puedes usar el launchctl listcomando en la terminal. Esto mostrará todos los trabajos cargados. Para encontrar un guión o trabajo específico, use grep, por ejemplo, launchctl list | grep your_script_name.

¿Qué ocurre si launchd utiliza demasiados recursos del sistema?

Si launchd está consumiendo recursos excesivos, generalmente se debe a un script o trabajo que se está comportando mal. Debe revisar los scripts que agregó recientemente y descargarlos mediante launchctl unload /path/to/job.plist.

¿Cuál es la diferencia entre cron y launchd?

Tanto cron como launchd son servicios de programación, pero funcionan de manera diferente. cron es un programador de trabajos basado en Unix más antiguo que ejecuta trabajos en tiempos fijos o intervalos definidos en un archivo crontab. launchd es el sistema más nuevo de Apple para macOS que puede iniciar trabajos en función de varios activadores, no solo del tiempo.

¿Puedo usar otros lenguajes de secuencias de comandos 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *