Je ne parviens pas à planifier un lancement périodique avec launchctl
/ launchd
sur 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.plist
dossier:
<?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 rsync
commande 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?
launchctl list
a affiché 1, mais seulement après avoir démarré l'agent manuellementlaunchctl start
.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
,launchctl
et 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:
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 parunload
charger votre démon avant de le charger si vous avez modifié le fichier.la source
launchd bash
de débogage - mais cela ne fonctionne pas sur Leopard (launchd
ne peut pas être lancé directement).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/rsync
place. Travaille pour moi!la source
essayez ceci, mes scripts fonctionnent sans utiliser la partie programme, juste des arguments de programme ...
remplacer
avec
la source
essayez d'ajouter ces clés à votre fichier plist
la source
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:
Le premier argument du
ProgramArguments
tableau est le programme à exécuter - vous l'avez omis. Si laProgram
clé est omise, elle prend par défaut le premier argument deProgramArguments
; 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 enps
sortie, 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 à laPATH
définition appropriée.La documentation pour cela se trouve dans
launchd.plist(5)
. Notez que cette page de manuel souligne que la valeur de laProgramArguments
clé est passée àexecvp(3)
. C'est laexecvp
page de manuel qui explique la recherche PATH.la source