launchd
puede hacer lo que usted necesita. Mientras que su sistema no está dormido todo el día, y está previsto el uso de la StartCalendarInterval
(ver abajo), launchd
va a ejecutar la secuencia de comandos una vez al día. Aquí es lo que quiero decir:
- Si usted programar un script para que se ejecute en (por ejemplo) 12:00 del mediodía, Y tu mac se despierta a las 12:00 del mediodía, a continuación, el script se ejecutará a las 12:00 del mediodía.
- Si usted programar un script para que se ejecute en (por ejemplo) 12:00 del mediodía, PERO el mac está en reposo a las 12:00 del mediodía, a continuación, el script se ejecutará tan pronto como su mac se despierta.
En mi humilde opinión, launchd
tiene una ventaja porque es parte de MacOS. La única 3ª parte de la herramienta que desee utilizar con es LaunchControl
(en lugar de la nativa launchctl
). LaunchControl
es una interfaz gráfica de usuario basada en la aplicación utiliza solamente para ayudarle a crear/editar su .plist
, y puede ayudar a la gestión y solución de problemas si es necesario. El .plist
archivo contiene las instrucciones que serán utilizados por launchd
a iniciar el programa, y puede ser muy simple. Y, por supuesto, usted puede evitar 3rd party software completamente por la simple creación de la necesaria .plist
"manualmente" con un editor de texto.
Como se mencionó anteriormente, la clave de configuración que necesita para utilizar en su .plist
para programar el tiempo para ejecutar su trabajo/script StartCalendarInterval
. De acuerdo a man launchd.plist
:
A diferencia de cron, que salta de trabajo invocaciones cuando el ordenador se encuentra en reposo, launchd comenzará el trabajo la próxima vez que el equipo se despierta. Si varios intervalos de transcurrir antes de que el equipo se despierta, los eventos se fundieron en un evento sobre el despertar de un sueño.
Ejemplo
He aquí un ejemplo de cómo utilizar launchd
a crear un User Agent
. El alcance de una User Agent
es que sólo se ejecuta para un solo usuario. Tenga en cuenta que también es posible crear Global Agent
o una Global Daemon
que se extiende por varios/todos los usuarios, pero vamos a dejar eso para otro día. :
- Crear una secuencia de comandos en el directorio de inicio (
~/
) a la salida de la fecha y la hora cada vez que se ejecute:
#!/bin/bash
CURRENTDATE=`date +"%c"`
echo Current Date and Time is: ${CURRENTDATE}
Nombre de la secuencia de comandos echodatetime.sh
& hacerlo ejecutable:
$ chmod 755 ~/echodatetime.sh
- Crear una .plist archivo en ~/Library/LaunchAgents/mdf.simple.exampleofPLIST.plist:
EDIT: ¡NOTA! NO USE ~/
como acceso directo para el directorio home del usuario! Usted debe utilizar una ruta de acceso completa de la especificación, o no funcionará.
<?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>Disabled</key>
<false/>
<key>Label</key>
<string>seamus.simple.example</string>
<key>ProgramArguments</key>
<array>
<string>/Users/seamus/echodatetime.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/Users/seamus/echodatetime.error.txt</string>
<key>StandardOutPath</key>
<string>/Users/seamus/echodatetime.log.txt</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>25</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>26</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>27</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>28</integer>
</dict>
<dict>
<key>Hour</key>
<integer>1</integer>
<key>Minute</key>
<integer>29</integer>
</dict>
</array>
</dict>
</plist>
Este .plist hará ~/echodatetime.sh
ser ejecutado en los siguientes horarios de cada día:
01:25
01:26
01:27
01:28
01:29
Usted puede cambiar el integer
valores en la matriz de la clave StartCalendarInterval
, para llegar en el momento que más le convenga. Este es solo un ejemplo que he utilizado para las pruebas.
El ejemplo anterior muestra una "ráfaga" de cinco (5) se ejecuta en intervalos de un minuto. Esto fue hecho para demostrar algo extraño sintaxis necesaria para un calendario. La programación de un evento único para que se ejecute una vez al día, cada día, a las 12:00 del mediodía se puede lograr sustituyendo el más simple StartCalendarInterval
clave se muestra a continuación en la .plist
se muestra arriba:
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</array>
-
load
su trabajo y comprobar que se está ejecutando:
$ launchctl load ~/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
$ launchctl list | grep seamus
- 0 seamus.simple.example
- Supervisar el archivo de salida declarado en la
StandardOutPath
clave:
$ tail -f ~/echodatetime.log.txt
Después de la load
ing el .plist archivo, puedes ver la datetime de salida en el tiempo señalado en la StartCalendarInterval
clave: intervalos de un minuto comienzo a las 01:25 y termina a las 01:29 si uso mi .plist archivo.
Miscelánea
El .plist
archivos anteriores han sido probados y funcionan correctamente en mi macbook pro con Mojave (ver 10.14.6). También se verificó el comportamiento de launchd
cuando una programación de eventos que se produce durante la sleep
: La tarea se ejecutó inmediatamente después de la mac "se despertó", y se registra el tiempo que se despierta (es decir, no de la hora programada).
Sí, el .plist sintaxis es arcano! Considere el uso de LaunchControl
en lugar de manualmente hacking estos archivos.
Potencialmente útiles sugerencia: puede comprobar Que la sintaxis de su .plist archivo así:
$ plutil -lint /Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
/Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist: OK
- Cuando haya terminado con este ejemplo, usted puede
remove
el trabajo de launchd
, y, a continuación, eliminar o mover el archivo desde tu carpeta ~/Library/LaunchAgents
. De lo contrario, su trabajo será re-iniciado por launchd
próxima vez que inicie sesión en:
$ launchctl remove seamus.simple.example
$ mv ~/LaunchAgents/sdm.simple.exampleofPLIST.plist ~/archive
Alternativamente, deje el archivo donde está, y establecer el Disabled
clave true
en el .plist:
<key>Disabled</key>
<true/>