Comment enregistrer un agent avec launchd

14

Je ne parviens pas à planifier un lancement périodique avec launchctl/ launchdsur OS X (Leopard). Fondamentalement, je ne parviens pas à trouver une liste d'instructions étape par étape sur le Web et l'approche intuitive ne fonctionne pas.

Le sync.plistdossier:

<?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 dans le chemin ~/Library/LaunchAgents.

Ensuite, j'ai enregistré le script en utilisant

launchctl load ~/Library/LaunchAgents/sync.plist

Enfin, pour tester son fonctionnement, j'ai commencé le travail:

 launchctl start net.madrat.utils.sync

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

Je suis assez sûr que le travail a été enregistré correctement car si j'essaie de démarrer un travail inexistant, j'obtiens un message d'erreur (que je n'ai pas obtenu dans la commande ci-dessus).

Qu'ai-je fait de mal?

Konrad Rudolph
la source

Réponses:

5

Lingon est un bon outil GUI pour gérer launchd. Le projet ne semble pas être pris en charge maintenant ... mais il fonctionne certainement toujours sur 10.5.x.

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

sudo launchctl list 

Cela vous dira si le .plist tire correctement. Il renverra 1 si le démon ne démarre pas et un «0» s'il réussit. Peut-être cherchez-le.

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

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

launchctl start

pas efficace là où un redémarrage était ..

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

CaseyIT
la source
Merci, mettre la commande dans un fichier shell supplémentaire et lancer ça a fait l'affaire. C'est une solution très insatisfaisante cependant… pourquoi l'invocation directe de la commande ne fonctionne-t-elle pas? Soit dit en passant, launchctl list a affiché 1, mais seulement après avoir démarré l'agent manuellement launchctl start.
Konrad Rudolph
Je ne suis pas positif, mais je pense que les fichiers launchd .plist sont vraiment juste destinés à définir des critères de «lancement à la demande» pour les démons ... ProgramArguments </key>.
CaseyIT
11

Longue réponse:

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

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

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

  • Si votre travail doit être exécuté même si aucun utilisateur n'est connecté, placez-le dans / Library / LaunchDaemons.
  • S'il n'est utile que lorsque les utilisateurs sont connectés, placez-le dans / Library / LaunchAgents ou dans les répertoires personnels LaunchAgents d'utilisateurs spécifiques (~ / 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 faux, je ne peux pas le tester pour le moment mais je l'aurais réglé sur net.madrat.utils.sync.plist. Il peut également être utile de commencer par unloadcharger votre démon avant de le charger si vous avez modifié le fichier.

Arko
la source
Merci pour l'info. Cependant: (1) J'ai déjà lu tous les documents que vous avez liés ci-dessus, et plusieurs autres. Nulle part cela ne dit comment lancer un agent. (Au moins, je ne l'ai trouvé nulle part.) Ce serait bien, si mon approche intuitive fonctionnait. (2) La modification du nom de fichier ne fonctionne pas non plus. :-( (3) certaines informations sont obsolètes. Par exemple, elles suggèrent la commande launchd bashde débogage - mais cela ne fonctionne pas sur Leopard ( launchdne peut pas être lancé directement).
Konrad Rudolph
@Konrad Rudolph: Vous êtes les bienvenus: :) @Skylarking obtient des points intéressants: avez-vous vérifié la prémission du fichier? Ou utilisé la commande sudo? J'ai aussi parfois dû redémarrer pour que launchctl fonctionne correctement.
Arko
3

Je ne trouve pas de documentation indiquant qu'il s'agit en fait d'un comportement standard, mais il semble que launchd nécessite des chemins absolus dans les fichiers plist. Essayez donc à la /usr/bin/rsyncplace. Travaille pour moi!

Erik Schoster
la source
0

essayez ceci, mes scripts fonctionnent sans utiliser la partie programme, juste des arguments de 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>
Becky
la source
0

essayez d'ajouter ces clés à votre fichier plist

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
agile
la source
0

Vous avez une mauvaise chose dans votre fichier .plist et une chose douteuse (chacun de ces points a été abordé dans les réponses précédentes; je les rassemble ici).

Vous feriez mieux d'écrire:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

Le premier argument du ProgramArgumentstableau est le programme à exécuter - vous l'avez omis. Si la Programclé est omise, elle prend par défaut le premier argument de ProgramArguments; il est probablement sage de ne le spécifier qu'une seule fois.

Parce que vous avez omis ce premier argument, votre .plist aura invoqué rsync (en étant nommé dans Program), mais le `` premier argument '' de rsync aurait été /path/to/folder, et non -ar(le programme en cours aura été très brièvement visible en pssortie, avant de se terminer avec une erreur, mais nommée comme -ar, qui est le contenu de l'argument zéro).

Il n'est pas nécessaire d'inclure le chemin vers rsync, mais dans ce type de contexte, il est probablement prudent de le faire, pour éviter d'avoir à se fier à la PATHdéfinition appropriée.

La documentation pour cela se trouve dans launchd.plist(5). Notez que cette page de manuel souligne que la valeur de la ProgramArgumentsclé est passée à execvp(3). C'est la execvppage de manuel qui explique la recherche PATH.

Norman Gray
la source