6 votes

Comment modifier un démon de lancement de façon permanente sous OS X El Capitan ?

J'ai modifié l'option par défaut org.postfix.master.plist de postfix pour fonctionner comme un démon Il peut donc m'envoyer un e-mail chaque fois qu'un utilisateur local reçoit un e-mail.

Par défaut :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.postfix.master</string>
    <key>Program</key>
    <string>/usr/libexec/postfix/master</string>
    <key>ProgramArguments</key>
    <array>
        <string>master</string>
        <string>-e</string>
        <string>60</string>
    </array>
    <key>QueueDirectories</key>
    <array>
        <string>/var/spool/postfix/maildrop</string>
    </array>
    <key>AbandonProcessGroup</key>
    <true/>
</dict>
</plist>

Modifié :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/var/spool/postfix/maildrop</string>
        </array>
        <key>AbandonProcessGroup</key>
        <true/>
</dict>
</plist>

Cependant, ce fichier est sous /System/Library/LaunchDaemons/ J'ai donc dû désactiver temporairement SIP pour modifier le fichier. J'ai lu qu'après la prochaine mise à jour de l'OS, toutes mes modifications disparaîtront à cause de SIP. Que puis-je faire pour que cela soit permanent ? Puis-je placer mon démon de lancement sous /Library/LaunchDaemons comme un second ?

6voto

Gordon Davisson Points 30215

Je n'ai pas encore eu à faire face à ce problème "pour de vrai", mais je pense que la meilleure solution est de le faire :

  1. Copiez le fichier .plist dans /Library/LaunchDaemons.
  2. Renommez-le (par exemple en ajoutant "local." au début du nom du fichier), et modifiez son fichier Label à faire correspondre. Si vous ne changez pas cela, launchd risque de se tromper entre cette valeur et l'originale.
  3. Faites toutes les autres modifications dont vous avez besoin
  4. Assurez-vous que la propriété est définie sur Root:wheel, et les permissions sur 644.
  5. Désactiver l'élément d'origine avec par exemple sudo launchctl unload -w /System/Library/LaunchDaemons/org.postfix.master.plist (le -w rend cela permanent).
  6. Chargez votre remplacement personnalisé avec par exemple sudo launchctl load /Library/LaunchDaemons/local.org.postfix.master.plist (ou juste redémarrer).

BTW, si vous désactivez SIP et modifiez le fichier existant, cela ne sera pas nécessairement annulé par une mise à jour de l'OS. Mais il pourrait En outre, il faudrait vérifier chaque mise à jour (y compris les mises à jour de sécurité, etc.), ce qui est pénible.

0 votes

Votre solution fonctionne. En changeant le Label La valeur est en effet importante. Sinon, le démon ne démarrera pas.

0voto

Yoric Points 996

J'ai eu un problème similaire, et ce qui précède ne l'a pas résolu pour moi. Je partage mon point de vue, si jamais cela peut faire gagner du temps à quelqu'un (j'ai lutté pendant quelques heures avec ce problème).

Tldr : J'ai dû exécuter mon plist en tant que Root.


Dans mon cas, la plist se chargeait correctement depuis le Terminal :

sudo launchctl load /Library/LaunchAgents/com.name.of.the.plist

Mais ça ne l'a pas fait après avoir redémarré l'ordinateur. Au fait, vous pouvez vérifier si votre plist est chargé avec ce qui suit :

sudo launchctl list | grep "my.plist"

J'ai vu exactement l'erreur en ajoutant des journaux :

<key>StandardErrorPath</key>
<string>/Users/XXX/err.log</string>
<key>StandardOutPath</key>
<string>/Users/XXX/out.log</string>

Il a révélé ce message d'erreur :

sysadminctl[807:9587] sysadminctl should be run as root, or in interactive mode!

J'ai vraiment pensé que mon script était déjà exécuté en tant que Root (parce qu'il se trouve dans /Library/LaunchAgents/ ), mais il ne l'était pas, et mon script obtenait un problème de permission !

Maintenant, pour exécuter le plist en tant que Root :

  • Déplacer le plist de /Library/LaunchAgents/ a /Library/LaunchDaemons/
  • Ajouter le UserName comme suit :

    <key>UserName</key> <string>root</string>

Dans mon cas, cela a bien fonctionné !

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