0 votos

Apagar script en MacOS / Copia de seguridad del disco RAM

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?

1voto

Jose Chavez Puntos 645

En cuanto a tu comparación con Linux: Mac OS X sí tenía el sistema "rc", que conoces de Linux (en realidad se llama sistema de init SysV). En 2005 este sistema se abandonó con OS X Lion, y en su lugar se introdujo el sistema launchd, más moderno, que permite, entre otras cosas, un arranque mucho más rápido.

En Linux se ha producido el mismo cambio, aunque más tarde que en MacOS. Hoy en día, las distribuciones de Linux suelen utilizar systemd, upstart o una versión "moderna" similar de un sistema de inicio.

En cuanto a su solución - es realmente un hack, y no se hace de la manera correcta. Por eso tienes problemas. Estás atrapando tanto SIGTERM como SIGKILL - esto va en contra de las recomendaciones, y es la causa del mensaje de error "No such file or directory".

Básicamente lo que ocurre al apagarse (esto es completamente similar a Linux) es que a cada proceso se le envía SIGTERM para hacerle saber que debe terminar. El proceso entonces sólo tiene un tiempo muy corto para cerrarse (es decir, en unos pocos segundos) - de lo contrario el sistema envía la señal SIGKILL para realmente matar el proceso si no está respondiendo.

En su caso, cuando la copia tarda un poco más, atrapará ambos señales y ejecutará su función shutdown() dos veces.

No has incluido la configuración de tu launchd (es decir, probablemente un plist de demonio), pero debes tener cuidado de tener configuradas las dependencias y las órdenes aquí para que tu hack funcione. De lo contrario, te arriesgas a que el disco RAM sea desmontado antes de que se llame a shutdown (que es probablemente lo que ocurre cuando ejecutas shutdown la segunda vez debido a la señal SIGKILL.

Que yo recuerde el archivo /etc/rc.shutdown.local sigue siendo un método válido para ejecutar programas al apagarse. Esta es, con mucho, la forma más fácil de hacerlo.

Simplemente crea el archivo /etc/rc.shutdown.local y hazlo ejecutable. Debe comenzar con un shebang como su actual script, pero sólo necesita contener los comandos que utiliza para copiar los archivos a su copia de seguridad.

Si quieres hacerlo correctamente con launchd podrías modificar tu hack para manejar las señales correctamente, y luego usar las funciones xpc_transaction_begin/end para hacer saber al sistema que tu programa está haciendo un trabajo útil, y el cierre debe ser retrasado hasta que termine -- o alternativamente usar la funcionalidad de activación de eventos en launchd.

Te recomiendo que pruebes primero con /etc/rc.shutdown.local. Está obsoleto, pero por lo que recuerdo todavía funciona.

Una pequeña advertencia es probablemente también una buena idea para usted. Recuerde que nunca está garantizado que su programa de apagado se ejecute. Por lo tanto, no es una buena idea guardar cosas que no quieres perder en un disco RAM como ese. Un solo corte de energía y tus datos se pierden. En su lugar, utiliza sincronizaciones de datos frecuentes o algo similar para asegurar que los datos se respaldan periódicamente en un almacenamiento permanente.

En cuanto a su pregunta sobre si existe un enfoque mejor, la respuesta es "muy probablemente, sí". La idea de copiar una carpeta web a los discos RAM parece un poco histórica y anticuada. No tenemos información sobre lo que estás haciendo con esa carpeta web, pero si sólo estás sirviendo sitios web y quieres que sea rápido usando un disco RAM - ese es el enfoque equivocado. Es mucho mejor utilizar la funcionalidad de caché vfs incorporada de MacOS (similar a cualquier otro sistema operativo moderno, como Linux).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X