Script de cierre en macOS / RAM Disk Backup

0

Estoy intentando crear una secuencia de comandos de apagado en macOS (10.11), es decir, una secuencia de comandos que se ejecuta al cerrar, no una secuencia de comandos que cierra el Mac. El sistema linux "rc" no está presente en macOS.

He buscado y buscado una solución, y esta es la única que he podido encontrar. Se inicia al inicio con launchd, y las funciones de inicio y apagado se ejecutan cuando deberían:

#!/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 dije, las funciones de inicio () y de apagado () se ejecutan cuando se espera. El problema está dentro de los comandos de la función de apagado. Es un script bastante simple, simplemente copia el contenido del disco RAM a una carpeta en el 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 script real está cargado con extras que registran cosas, y puedo confirmar que el script completo se ejecuta. Pero lo que sucede es que la línea cp falla. A veces falla completamente, y la carpeta de respaldo está vacía. Pero más a menudo, obtiene parte de la estructura del disco RAM y deja de copiar los archivos (pero no exactamente) en el mismo lugar.

Muchas veces lanzará el error cp: /Volumes/webfolder/: No such file or directory aunque ya haya copiado cien elementos de esa carpeta. Me hace pensar que el comando de apagado es desmontar el disco RAM antes de que mi secuencia de comandos tenga tiempo de finalizar la copia de seguridad. Tenga en cuenta que, como es un disco RAM, solo toma unos segundos copiar todos los archivos. Pero parece que no es suficiente. Si hubiera una forma en la que pudiera pausar el proceso de apagado mientras mi script se está ejecutando, luego, ¡sería ideal! ¿O tal vez un mejor enfoque de esto por completo?

    
pregunta l008com 08.03.2018 - 01:55

1 respuesta

1

Con respecto a su comparación con Linux: Mac OS X sí tuvo el sistema "rc", lo sabe desde Linux (en realidad se llama sistema de inicio SysV). En 2005, este sistema se abandonó con OS X Lion, y en su lugar se introdujo el sistema launchd más moderno, lo que llevó, entre otras cosas, a botas mucho más rápidas.

En Linux ha ocurrido el mismo cambio, pero más tarde que en macOS. En la actualidad, las distribuciones de Linux suelen utilizar systemd, upstart o una versión "moderna" similar de un sistema init.

Con respecto a su solución, es realmente un hack y no se hace de la manera correcta. Por eso tienes problemas. Está atrapando tanto a SIGTERM como a SIGKILL - esto va en contra de las recomendaciones, y es la causa del mensaje de error "No existe tal archivo o directorio".

Básicamente, lo que sucede cuando se apaga (esto es completamente similar a Linux) es que se envía SIGTERM a cada proceso para que sepa que debe terminar. Entonces, el proceso solo tiene un tiempo muy corto para cerrar (es decir, en unos pocos segundos); de lo contrario, el sistema envía la señal SIGKILL para finalizar el proceso si no responde.

En su caso, cuando la copia demora demasiado, capturará las señales ambas y ejecutará la función shutdown () dos veces.

No ha incluido su configuración de lanzamiento (es decir, probablemente una lista de demonios), pero debe tener cuidado de tener configuradas las dependencias y las órdenes aquí para que funcione su truco. De lo contrario, corre el riesgo de que se desmonte el disco RAM antes de que se solicite el cierre (que es probablemente lo que sucede cuando ejecuta el apagado por segunda vez debido a la señal SIGKILL.

Por lo que recuerdo, el archivo /etc/rc.shutdown.local sigue siendo un método válido para ejecutar programas en el cierre. Esta es, con mucho, la forma más fácil de hacerlo.

Simplemente crea el archivo /etc/rc.shutdown.local y hazlo ejecutable. Debería comenzar con un shebang como tu script actual, pero solo debe contener los comandos que utilizas para copiar los archivos en tu copia de seguridad.

Si desea hacerlo correctamente con launchd, puede modificar su truco para manejar las señales adecuadamente, y luego usar las funciones xpc_transaction_begin / end para que el sistema sepa que su programa está haciendo un trabajo útil, y el apagado debe demorarse hasta finalizado, o alternativamente use la funcionalidad de activación de eventos en launchd.

Te recomendaría que pruebes primero /etc/rc.shutdown.local. Está en desuso, pero por lo que recuerdo, aún funciona.

Una pequeña advertencia es probablemente también una buena idea para ti. Recuerde que nunca se le garantiza que su programa de apagado se ejecutará. Por lo tanto, no es una buena idea mantener las cosas que no desea perder en un disco RAM como ese. Un solo corte de energía y sus datos se pierden. En su lugar, use sincronizaciones de datos frecuentes o similares para garantizar que los datos se realicen periódicamente copias de seguridad en un almacenamiento permanente.

Con respecto a su solicitud de si existe un mejor enfoque, entonces la respuesta es "muy probablemente, sí". La idea de copiar una carpeta web en discos RAM parece un poco histórica y anticuada. No tenemos información sobre lo que está haciendo con esa carpeta web, pero si solo está sirviendo sitios web y desea que sea rápido mediante el uso de un disco RAM, ese es el enfoque equivocado. Es mucho mejor usar la funcionalidad de almacenamiento en caché vfs integrada de macOS (similar a cualquier otro sistema operativo moderno, como Linux).

    
respondido por el jksoegaard 08.03.2018 - 10:02

Lea otras preguntas en las etiquetas