launchd es una herramienta para iniciar, detener y administrar scripts y procesos. Si ha trabajado con alguna versión de Linux, es posible que esté familiarizado con cron. launchd es básicamente cron en macOS.
¿Qué son los demonios?
Los demonios (pronunciados «demonios») son scripts que se ejecutan en segundo plano. A diferencia de las aplicaciones, los demonios se ejecutan como procesos y no están bajo el control directo del usuario o de otra aplicación. En macOS, están bajo el mando del framework launchd, que decide cuándo se inician y se detienen.
El nombre inusual proviene de el demonio de maxwellun agente imaginario que clasifica moléculas en un experimento mental de termodinámica.
Escribir guiones
Para ejecutar 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 bash, puede consultar nuestra guía para principiantes sobre secuencias de comandos bash.
Uso de launchd
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 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 apropiado.
Una definición de trabajo se parece a lo que se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://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 antes de colocarlo en el directorio correcto (ver más abajo).
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.
- Ejecutar en carga: describe cuándo debe ejecutarse 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>
Agentes contra demonios
Una vez que haya escrito la descripción de su trabajo, deberá guardarla en el directorio apropiado.
launchd distingue además entre agentes y demonios. Un agente se ejecuta en nombre del usuario que ha iniciado sesión, mientras que un demonio se ejecuta bajo el usuario raíz. Esto significa que si desea restringir un script a una cuenta de usuario específica, puede usar un agente. Si quiere que algo se ejecute sin importar quién esté conectado, usará un demonio.
La diferencia entre agentes y demonios se basa en dónde se guardan en la computadora:
- “~/Library/LaunchAgents” se ejecuta en nombre del usuario que inició sesión
- “/Library/LaunchDaemons” se ejecuta en nombre de los usuarios raíz
Deberá guardar su plist en la ubicación correcta.
Cargando trabajos en launchctl
Una vez que haya creado sus scripts y guardado su agente en el lugar correcto, deberá cargarlo en 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 list
en 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
Para eliminar el script de la cola de launchctl, use el unload
dominio:
launchctl unload ~/Library/LaunchAgents/local.restart.plist
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
.
Conclusión
Puede usar launchd para crear secuencias de comandos que hacen cosas como limpiar archivos, reiniciar su servidor en un horario o ejecutar una aplicación cuando aparece un archivo determinado. Para obtener más información sobre launchd, puede consultar el tutorial de laucnhd.
Credito de imagen: Maxwell’s_demon