Hay algunas advertencias con la creación de archivos launchd .plist. Las resumiré a continuación:
- Cada día de la semana debe ser una entrada especificada en un lugar en el StartCalendarInterval entrada del diccionario.
- Los días laborables van de 1 a 5. Los domingos van del 0 al 7 (lo sé, ¿verdad?)
- Tienes que saber cómo quieres que funcione tu artículo y colocar el
.plist
en los directorios/carpetas correspondientes:
~/Library/LaunchAgents
- Específico para el usuario. Se ejecutará cuando el usuario esté conectado.
/Library/LaunchAgents
- Específico para todos los usuarios. Se ejecutará cuando el usuario(s) esté(n) conectado(s).
/Library/LaunchDaemons
- Se ejecuta independientemente de si el usuario(s) está(n) conectado(s). Debe utilizar sudo
para cargar .plist
Mi preferencia es #3 (cargar como un LaunchDaemon) para que mi script se ejecute tanto si estoy conectado como si no. Cuando se utiliza como un LaunchDameon, debe utilizar sudo
para cargar el .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 pueda surgir y mantiene la convención de nombres de Apple de com.apple.some-app.plist
Esto es totalmente opcional por su parte.
A continuación se muestra un script que estoy utilizando para limpiar los archivos de trabajo (lo he modificado para sus parámetros de tiempo específicos). Puedes editar este archivo con tu editor de texto favorito (yo uso Komodo Edit ), pero TextEdit o incluso nano
o vi
desde la línea de comandos 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>
Película de bonificación....
La siguiente parte es opcional...
Para poder obtener alguna información de que mis scripts se ejecutaron y cuál fue el resultado, creé una pequeña función AppleScript que invoca el 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 script, compruebo el éxito o el fracaso, dependiendo de lo que sea (es decir, un archivo existente en un directorio 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
Esta es la muestra de la salida: