15 votes

Comment enregistrer un agent avec launchd

Je n'arrive pas à programmer un lancement périodique avec launchctl / launchd sur OS X (Leopard). En gros, je n'arrive pas à trouver une liste d'instructions étape par étape sur le web et l'approche intuitive ne fonctionne pas.

Le site sync.plist fichier :

<?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>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

J'ai mis ce script à l'intérieur du chemin d'accès. ~/Library/LaunchAgents .

Ensuite, j'ai enregistré le script en utilisant

launchctl load ~/Library/LaunchAgents/sync.plist

Enfin, pour vérifier que cela fonctionne, j'ai a commencé le travail :

 launchctl start net.madrat.utils.sync

- Il ne s'est rien passé. L'exécution manuelle de la rsync dans le terminal donne le résultat attendu.

Je suis pratiquement sûr que la tâche a été enregistrée correctement car si j'essaie de lancer une tâche inexistante, j'obtiens un message d'erreur (que je n'a pas obtenu dans la commande ci-dessus).

Qu'est-ce que j'ai fait de mal ?

12voto

Arko Points 1692

Longue réponse :

Il est difficile de travailler avec launchd sans comprendre certains principes de base. Il est donc probable que vous ne trouverez pas d'instruction étape par étape, il a tellement de capacités. Une bonne idée est de se diriger vers le guide de démarrage sur le CDA : http://developer.apple.com/macosx/launchd.html

Vous pouvez également lire les pages de manuel de launchd , launchctl et la syntaxe des fichiers .plist, launchd.plist .

Il y a un malentendu fréquent sur l'endroit où mettre votre agent ou votre deamon, alors laissez-moi pousser quelques informations à ce sujet ici :

  • Si votre tâche doit être exécutée même si aucun utilisateur n'est connecté, placez-la dans /Library/LaunchDaemons.
  • S'il n'est utile que lorsque les utilisateurs sont connectés, mettez-le dans /Library/LaunchAgents, ou dans les répertoires personnels LaunchAgents de certains utilisateurs (~/Library/LaunchAgents).
  • Ne placez pas votre travail dans /System/Library, qui est réservé aux démons fournis par le système.
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

Réponse courte :

Le nom de votre fichier plist est peut-être erroné, je ne peux pas le tester pour l'instant mais je l'aurais réglé sur net.madrat.utils.sync.plist . Il peut également être utile de commencer par unload votre deamon avant de le charger si vous avez modifié le fichier.

0 votes

Merci pour ces informations. Cependant : (1) J'ai déjà lu tous les documents dont vous avez donné le lien ci-dessus, et plusieurs autres. Nulle part il n'est dit comment lancer un agent. (Du moins, je ne l'ai trouvé nulle part.) Ce serait bien, si mon approche intuitive fonctionnait. (2) Changer le nom du fichier ne fonctionne pas non plus :-( (3) Certaines des informations sont dépassées. Par exemple, ils suggèrent la commande launchd bash pour le débogage - mais cela ne fonctionne pas sur Leopard ( launchd ne peut être lancé directement).

0 votes

@Konrad Rudolph : You're welcome : :) @Skylarking obtient quelques points intéressants : avez-vous vérifié la prémission du fichier ? Ou utilisé la commande sudo ? J'ai également dû redémarrer parfois pour que launchctl fonctionne correctement.

6voto

CaseyIT Points 3331

Lingon est un bon outil GUI pour gérer launchd. Le projet semble ne plus être supporté maintenant... mais il fonctionne toujours sous 10.5.x.

Mais pour votre problème spécifique... avez-vous essayé

sudo launchctl list 

Cela vous dira si le .plist est lancé correctement. Il retournera 1 si le daemon ne démarre pas, et un '0' s'il réussit. Peut-être que vous devriez chercher ça.

Chaque fois que je vois un '1', c'est généralement parce que j'ai placé le script au mauvais endroit, que j'ai fait une faute de frappe ou que j'ai défini des permissions incorrectes.

Aussi.... redémarrer souvent ... J'ai vu

launchctl start

n'est pas efficace lorsqu'un redémarrage a eu lieu.

Aussi, en regardant votre question de plus près.... pourquoi ne pas simplement mettre ce code rsync dans un script bash...et le coller dans /usr/bin/ ..... Alors vous pourriez juste chmod+x ce fichier.... et simplifier votre .plist pour lancer ce script quand vous le souhaitez ....

0 votes

Merci, en mettant la commande dans un fichier supplémentaire Shell et en lançant que a fait l'affaire. Mais c'est une solution très insatisfaisante pourquoi ne pas invoquer la commande directement ? À propos, launchctl list hat l'affichage 1, mais seulement après avoir démarré l'agent manuellement en utilisant launchctl start .

0 votes

Je ne suis pas sûr, mais je pense que les fichiers .plist de launchd sont vraiment juste destinés à définir des critères de 'lancement à la demande' pour les démons... Peut-être n'était-il pas sûr de ce qu'il fallait faire avec les arguments que vous aviez passés dans <key>ProgramArguments</key>.

4voto

defaultNINJA Points 113

Je ne trouve pas de documentation indiquant que c'est un comportement standard, mais il semble que launchd exige des chemins absolus dans les fichiers plist. Essayez donc /usr/bin/rsync à la place. Ça marche pour moi !

0voto

Becky Points 1

Essayez ceci, mes scripts fonctionnent sans utiliser la partie programme, juste les args du programme...

remplacer

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

avec

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0voto

agile Points 1

Essayez d'ajouter cette clé à votre fichier plist

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X