Question OS X - Comment faire fonctionner le démon launchd sur Yosemite et El Capitan


Je ne suis pas étranger à lancer sur OS X. J'ai créé plusieurs démons dans le passé, le dernier avec Mountain Lion Mavericks.

Cependant, je semble avoir du mal à obtenir le plus simple des plistes travaillant sur Mavericks et El Capitan. Au départ, j'ai copié mon plist qui exécute Tomcat et l'a modifié pour que WebSphere Liberty Profile s'exécute au démarrage. Après avoir vu quelques erreurs, j'ai décidé d'essayer l'exemple suivant du propre [site] d'Apple [1]. Ce qui suit ne fonctionne même pas:

<?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>com.example.hello</string>

    <key>ProgramArguments</key>
    <array>
        <string>hello</string>
        <string>world</string>
    </array>

    <key>KeepAlive</key>
    <true/>

</dict>

Chaque fois que je place le fichier plist dans / Library / LaunchDaemons, puis que je charge le plist, les erreurs suivantes apparaissent dans la console:

10/5/15 11: 52: 44.868 AM com.apple.xpc.launchd [1]: (com.example.hello) Ce service est défini pour fonctionner en permanence et est intrinsèquement inefficace.

10/5/15 11: 52: 44.869 AM com.apple.xpc.launchd [1]: (com.example.hello [66956]) Le service n'a pas pu être initialisé: 15A284: xpcproxy + 12644 [1472] [19011403-4854- 3CCD-9FCF-49C36302EB40]: 0x2

10/5/15 11: 52: 44.870 AM com.apple.xpc.launchd [1]: (com.example.hello) Le service n'a duré que 0 seconde. Pousser réapparaître de 10 secondes.

Et c'est tout ce qui concerne la sortie. J'ai essayé d'écrire dans un journal StandardOutput et StandardError, mais les fichiers journaux sont vides.

Étant donné que je vois cette situation se produire à la fois sur Yosemite et El Capitan, j'ai pensé que cela devait être quelque chose avec des autorisations:

-rw-r - r-- 1 roue de racine 418 Oct 5 11:52 helloworld.plist

Cependant, j'ai essayé d'exécuter le démon avec des autorisations définies sur 644 et 755, mais je vois toujours la même erreur de console.

Est-ce que j'oublie quelque chose?


3
2017-10-05 17:12


origine


Rien d'important n'a changé. Je vous suggère de fermer cette question et d'en créer une nouvelle sur votre problème réel. Incluez le plist WebSphere launchd en question et les erreurs exactes qui vous concernent. L’exemple ne fonctionne pas tel quel car il nécessite une commande appelée hello dans le système par défaut $PATH, et cela hello prendre une dispute world. Lancer ce plist tel quel sur un système El Capitan en stock échouera immédiatement car le système ne trouve pas de commande hello. - Spiff
@Spiff - Mon vrai problème est de faire travailler un plist. Si je peux avoir un exemple simple, alors c'est tout ce dont j'ai besoin. J'ai déjà un outil qui lance un script shell wrapper launchd, qui lance Tomcat. Cependant, ce plist utilise des balises obsolètes et n'utilise pas de balises plus récentes telles que KeepAlive (et oui, je sais que KeepAlive existe depuis OS X 10.5) - Chris Harris


Réponses:


Comme je le vois, <key>KeepAlive</key> est en sortie com.apple.xpc.launchd[1]: (com.example.hello) This service is defined to be constantly running and is inherently inefficient. Il se dit alors de redémarrer le processus en 10 secondes à partir de <key>.

Je ne suis pas sûr à 100% de ce que com.apple.xpc.launchd[1]: (com.example.hello[66956]) Service could not initialize: 15A284: xpcproxy + 12644 [1472][19011403-4854-3CCD-9FCF-49C36302EB40]: 0x2 dit parce que je n'ai pas de journal de l'événement, mais on dirait qu'il proteste contre l'événement de cet original <key> parce que cela n'exécute rien d'autre. Peut-être essayer de retirer le <key> ou le changer pour autre chose? peut-être:

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

<key>KeepAlive</key>
<false/>

ou

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

Encore une fois, je ne suis pas sûr à 100%, mais je suggère d'essayer quelque chose comme ça. L'OS proteste que le noeud keepAlive n'est pas nécessaire, alors bonne chance.


1
2017-10-05 17:25



J'ai essayé de définir KeepAlive sur false. Il n'y a plus d'erreurs dans la console. C'est un bon signe. Je ne vois aucune sortie sur la console cependant (bonjour monde ou monde juste, quel que soit ce que c'est supposé être). - Chris Harris


J'ai pu créer un exemple de travail basé sur l'aide de @Dooley_labs et @Spiff (merci).

L'exemple suivant fera écho à Hello World vers le fichier journal spécifié toutes les 10 secondes. La console n'affiche aucune sortie, mais lorsque je visualise le contenu du fichier journal, je vois que Hello World lui est écrit à plusieurs reprises.

<?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>com.example.hello</string>

        <key>ProgramArguments</key>
        <array>
            <string>echo</string>
            <string>Hello World</string>
        </array>

        <key>KeepAlive</key>
        <true/>

        <key>StandardOutPath</key>
        <string>/var/log/helloworld.log</string>

    </dict>

</plist>

1
2017-10-07 15:33



pouvez-vous expliquer comment vous l'avez fait? où est placée cette pliste? comment le chargez-vous? avez-vous retiré le SIP ou des choses comme ça? Je ne suis pas capable de faire ça. PS: il n'y a aucune preuve de la course à pied - EsseTi
@EsseTi - Vous placez le fichier plist dans / Library / LaunchDaemons / et tapez sudo launchctl load <name_of_plist_file> dans le terminal. Pour voir la preuve, ouvrez le fichier journal dans /var/log/helloworld.log. Vous verrez que le fichier plist est écrit par le démon. - Chris Harris
Je vois, cela fonctionne. Je n'arrive toujours pas à le faire fonctionner avec mon propre script qui fonctionnait sous osx 10.10. PS: j'utilise un script dans ~/Library/LaunchAgent et j'ai aussi essayé de passer à /Library/LaunchAgent comme rootmais pas de chance. Je vais commencer par cet exemple et voir ce que je peux faire. - EsseTi


Vous allez vous gifler quand vous lisez ceci, mais vous n'avez pas dit à launchctl quel exécutable exécuter!

La première réponse a correctement "echo" comme premier "ProgramArguments", mais n’a pas été jusqu’à dire que c’était le problème.

Je crois que vous auriez également pu le faire avec la clé "Program", mais je ne suis pas sûr que vous ne devriez pas le répéter dans la clé "ProgramArguments", qui est, selon moi, le tableau arg [] transmis à l'exécutable.

Une autre chose à faire est de toujours lister le chemin complet vers les exécutables. launchd / launchctl est assez serré, mais néanmoins, un méchant pourrait placer un exécutable "echo" malveillant dans le $ PATH par défaut quelque part, puis attendre que launchctl ré-analyse le plist LaunchDaemon.


0
2018-03-03 20:46