Sto tentando di creare uno script di arresto in macOS (10.11), ovvero uno script che viene eseguito allo spegnimento, non uno script che si chiude nel Mac. Il sistema linux "rc" non è presente in macOS.
Ho cercato e cercato una soluzione, e questo è l'unico che sono riuscito a trovare. Viene avviato all'avvio con launchd e le funzioni di avvio e arresto vengono eseguite quando dovrebbero:
#!/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;
Come ho detto, entrambe le funzioni startup () e shutdown () vengono eseguite quando previsto. Il problema si trova all'interno dei comandi della funzione di spegnimento. È uno script piuttosto semplice, copia semplicemente il contenuto del disco ram in una cartella sul disco rigido:
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
}
Lo script vero e proprio è caricato con extra che registrano roba e posso confermare che l'intero script viene eseguito. Ma quello che succede è che la riga cp
fallisce. A volte fallisce completamente e la cartella di backup è vuota. Ma più spesso, ottiene parte della struttura del disco RAM e interrompe la copia dei file intorno (ma non esattamente) nello stesso punto.
Spesso genera l'errore cp: /Volumes/webfolder/: No such file or directory
anche se ha già copiato un centinaio di elementi da quella cartella. Mi viene da pensare che il comando shutdown stia smontando il disco RAM prima che il mio script abbia il tempo di terminare il backup. Tieni presente che, trattandosi di un disco RAM, bastano un paio di secondi per copiare tutti i file da esso. Ma sembra che non sia abbastanza. Se ci fosse un modo per mettere in pausa il processo di spegnimento mentre il mio script è in esecuzione, quindi procedere, sarebbe l'ideale! O forse un approccio migliore a questo interamente?