Hay algunas advertencias con la creación de archivos .plist de launchd. Los resumiré a continuación:
- Cada día laborable debe ser una entrada especificada en una entrada del diccionario StartCalendarInterval .
- Los días de la semana van de 1 a 5. El domingo es 0 y 7 (lo sé, ¿verdad?)
- Debe saber cómo desea que se ejecute su elemento y colocar el
.plist
en los directorios / carpetas apropiados:
-
~/Library/LaunchAgents
- Específico para el usuario. Se ejecutará cuando el usuario haya iniciado sesión.
-
/Library/LaunchAgents
- Específico para todos los usuarios. Se ejecutará cuando el (los) usuario (s) esté (n) conectado (s).
-
/Library/LaunchDaemons
: se ejecuta independientemente de que los usuarios hayan iniciado sesión. Debe usar sudo
para cargar .plist
Mi preferencia es # 3 (cargar como LaunchDaemon) por lo que mi script se ejecutará independientemente de que haya iniciado sesión o no. Cuando se utiliza como LaunchDameon, debe usar sudo
para cargar .plist
:
sudo lauchctl load com.user.fileCleanup.plist
Nota: En cuanto a la convención de nombres en mi ejemplo, me gusta usar com.user.< name of my script >.plist
. Esto me ayuda a identificar y depurar cualquier problema que surja y se mantiene con la convención de nombres de Apple de com.apple.some-app.plist
. Esto es completamente opcional en su parte.
A continuación hay un script que estoy usando para limpiar archivos de trabajo (lo modifiqué para tus parámetros de tiempo específicos). Puedes editar este archivo con tu editor de texto favorito (uso Komodo Edit ), pero TextEdit o incluso nano
o vi
de la línea de comando 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>Label</key>
<string>com.user.fileCleanup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/allan/Documents/Scripts/Unix/fileCleanup.sh</string>
</array>
<key>StartCalendarInterval</key>
<!-- Weekdays are 1 - 5; Sunday is 0 and 7 -->
<array>
<dict>
<key>Weekday</key>
<integer>1</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>2</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>3</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>4</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>5</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
</array>
</dict>
</plist>
Imágenes de bonificación ....
La siguiente parte es opcional ...
Para poder obtener información de que mis scripts se ejecutaron y cuál fue el resultado, creé una pequeña función AppleScript que invoca a display notification
(es bastante simple para mis necesidades, pero obviamente podría mejorarse).
on run argv
set Message to item 1 of argv
set Title to item 2 of argv
set aud to item 3 of argv
set STitle to "Terminal"
set Snd to "Blow.aiff"
if (aud = "sound") then
display notification Message with title Title subtitle STitle sound name Snd
else
display notification Message with title Title subtitle STitle
end if
end run
Dentro de mi secuencia de comandos, verifico el éxito o el fracaso, según lo que sea (es decir, un archivo existente en un directorio en particular), generará una notificación. Si no, otra notificación, pero esta vez con sonido!
#!/bin/bash
if [ -f "$SOURCE" ]
then
scp -q "$SOURCE" "$TARGET"
osascript $ASCRIPT_DIR/notify.scpt "Podcast Transfered successfully" "$TITLE -- SUCCESS" "nosound"
else
osascript $ASCRIPT_DIR/notify.scpt "The file $TARGET does not exist" "$TITLE -- ERROR" "sound"
fi
Aquí está la salida de muestra: