5 votes

Comment exécuter script au démarrage et à l'arrêt d'OS X El Capitan

En fait, je veux faire un lecteur de RAM lié à ce script sur mon Mac.

Voici ce que j'ai fait :

  1. Désactiver SIP en mode de récupération en utilisant la commande "csrutil".

  2. Création d'un fichier plist dans /Library/LaunchDaemons/
    et est entré launchctl -w /Library/LaunchDaemons/vn.magik.ramdisk.plist

    <?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>vn.magik.ramdisk</string>
            <key>ProgramArguments</key>
                <array>
                  <string>/Users/khacpm/ramdisk.sh</string>
                </array>
            <key>RunAtLoad</key>
                <true/>
            <key>StandardOutPath</key>
                <string>/Users/khacpm/ramdisk.log</string>
            <key>StandardErrorPath</key>
                <string>/Users/khacpm/ramdisk.err</string>
        </dict>
    </plist>
  3. Créer le fichier .sh et le mettre dans ~/ramdisk.sh

    code :

    function fstartup()
    {
        //put folder into ramdisk
    }
    function fshutdown()
    {
        //detach ramdisk
    }
    
    function framdisk()
    {
        //do something
    }
    trap fshutdown SIGTERM
    trap fshutdown SIGKILL
    fstartup;

Le problème est que la fonction fstartup fonctionne bien mais il semble que la fonction fshutdown ne soit pas appelée par le système.

0 votes

Avez-vous essayé de désactiver SIP pour voir si vos scripts sont même compatibles avec cette nouvelle protection ?

0 votes

J'ai déjà configuré le nvram rootless=0, mais cela ne fonctionne pas.

0 votes

Vous ne pouvez pas modifier /System avec sip. Je vais répondre à comment désactiver cela

1voto

Andrew Wright Points 11

Je crois que la correction du shell script devrait être :

function fstartup()
{
    //put folder into ramdisk
     tail -f /dev/null &
     wait $!
}
function fshutdown()
{
    //detach ramdisk

}

function framdisk()
{
    //do something
}
trap fshutdown SIGTERM
trap fshutdown SIGKILL
fstartup;

Pour qu'il attende pendant le démarrage, et non l'arrêt.

J'exécute actuellement ma version et elle semble fonctionner correctement, elle exécute correctement la fonction d'arrêt lorsque l'ordinateur s'éteint.

0voto

Anh Bảy Points 151

J'ai trouvé un bug dans mon script : Il manque ces lignes dans la fonction fshutdown :

tail -f /dev/null &
wait $!

la fonction correcte est :

function fstartup()
{
    //put folder into ramdisk
}
function fshutdown()
{
    //detach ramdisk
     tail -f /dev/null &
     wait $!
}

function framdisk()
{
    //do something
}
trap fshutdown SIGTERM
trap fshutdown SIGKILL
fstartup;

sur la base de document de Apple Lorsque le système s'arrête, il envoie un signal SIGTERM à tous les démons qu'il a lancés.
Mais mon ancien script s'exécute et se ferme après son démarrage.
Vous devez rendre votre script vivant et attendre le signal Sigterm en ajoutant quelques fonctions comme "sleep" ou "wait" pour rendre le script vivant.

1 votes

Si la suppression du bogue a résolu votre problème, veuillez expliquer si et pourquoi cela a résolu votre question dans votre réponse.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X