Estoy intentando crear un script de apagado en MacOS (10.11) - es decir, un script que se ejecute al apagar, no un script que apaga el Mac. El sistema linux "rc" no está presente en MacOS.
He buscado y rebuscado una solución y esta es la única que he podido encontrar. Se inicia en el arranque con launchd, y tanto las funciones de arranque como de apagado se ejecutan cuando deben:
#!/bin/bash
function startup()
{
## commands to create and fill ram disk
tail -f /dev/null &
wait $!
}
function shutdown()
{
## commands to backup contents of ramdisk
exit 0
}
trap shutdown SIGTERM
startup;
Como he dicho, tanto la función startup() como la shutdown() se ejecutan cuando se espera. El problema está en los comandos de la función shutdown. Es un script bastante simple, sólo copia el contenido del disco ram a una carpeta del disco duro:
function backup_ramdisk()
{
## empty ram disk backup folder
rm -R -f /webfolder-backup/*
## copy contents of the ramdisk to the ramdisk backup
cp -R /Volumes/webfolder/ /webfolder-backup/
## make me the owner
chown -R me /webfolder-backup/
chmod -R 777 /webfolder-backup/
exit 0
}
El actual script se carga con extras que registran cosas, y puedo confirmar que todo el script se ejecuta. Pero lo que ocurre es que el cp
La línea falla. A veces falla por completo, y la carpeta de copia de seguridad está vacía. Pero lo más frecuente es que se quede con parte de la estructura del disco RAM, y deje de copiar los archivos justo en el mismo punto (pero no exactamente).
A menudo se produce el error cp: /Volumes/webfolder/: No such file or directory
aunque ya haya copiado un centenar de elementos de esa carpeta. Me hace pensar que el comando de apagado está desmontando el disco RAM antes de que mi script tenga tiempo de terminar de hacer la copia de seguridad. Hay que tener en cuenta que, al ser un disco RAM, sólo tarda un par de segundos en copiar todos los archivos de él. Pero parece que eso no es suficiente. Si hubiera una manera de detener el proceso de apagado mientras mi script se está ejecutando, y luego proceder, ¡eso sería ideal! O tal vez un mejor enfoque para esto por completo?