3 votes

Pourquoi ma tâche 'launchd' ne répond-elle pas aux changements dans les fichiers surveillés ?

J'ai un launchd qui ne se déclenche pas lorsqu'un fichier est modifié, et je n'arrive pas à comprendre pourquoi elle échoue.

Lorsque je charge le .plist ci-dessous avec

launchctl load /Users/Rax/Library/LaunchAgents/com.crashplan.status.plist

le script spécifié est exécuté (une fois) et fonctionne comme prévu (je peux également l'exécuter avec succès directement depuis la ligne de commande). Mais lorsque le fichier sur le chemin de surveillance ( /Library/Logs/CrashPlan/history.log.0 ) change, rien ne se passe.

Qu'est-ce qui pourrait manquer pour empêcher cette tâche de répondre à la modification du fichier ?


<?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.crashplan.status</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Rax/Library/Automation/Shell/crashplan_status</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Logs/CrashPlan/history.log.0</string>
    </array>
</dict>
</plist>

2voto

moodforaday Points 2633

Pour info, j'ai essayé ici et cela semble fonctionner pour moi. Chaque fois que j'ai ajouté manuellement quelque chose à /Library/Logs/CrashPlan/history.log.0, le script s'est déclenché.

Il ne s'agit donc pas vraiment d'une réponse, mais plutôt d'une série de conseils pour le débogage. launchd :

Quelques conseils pour diagnostiquer launchd :

1) Utilisez le stdout y stderr et voir si quelque chose y est enregistré. Vous pouvez faire cela en ajoutant ces lignes à votre fichier com.crashplan.status.plist fichier.

<key>StandardErrorPath</key>
<string>/tmp/com.crashplan.status.stderr.log</string>
<key>StandardOutPath</key>
<string>/tmp/com.crashplan.status.stdout.log</string>

(Si plusieurs personnes utilisent le même Mac, vous voudrez peut-être utiliser un autre chemin que /tmp/, mais si vous êtes le seul à l'utiliser, cet endroit est aussi bon qu'un autre).

2) Avec le numéro 1, vous pouvez également ajuster votre script (/Users/Rax/Library/Automation/Shell/crashplan_status) pour inclure des informations de débogage telles que le moment où il a commencé et celui où il s'est terminé. Cela peut être aussi simple que quelque chose comme ceci ajouté près du sommet du script :

echo "$0: started at `date`"

et quelque chose comme ceci vers la fin

echo "$0: finished at `date`"

3) Avec le point 2, vous pouvez également utiliser quelque chose comme terminal-notifier pour vous montrer quand votre script est appelé, du moins jusqu'à ce que vous ayez dépassé le stade du débogage.

4) Si rien de tout cela ne vous aide, vous devriez vérifier l'état de sortie de toutes les commandes que vous appelez en crashplan_status et voyez si elles se terminent correctement. Par exemple, disons que vous exécutez echo dans votre crashplan_status

5) Votre environnement est-il en launchd différent de votre coquille d'une certaine manière ? La meilleure façon de le vérifier est d'ajouter cette ligne en haut de votre launchd script :

/usr/bin/printenv | /usr/bin/open -ef

ce qui entraînera la printenv à envoyer à la sortie standard et à ouvrir les résultats dans TextEdit.

Le problème d'environnement le plus courant que je rencontre est que le $PATH n'est pas correctement défini pour launchd. Il est généralement défini dans vos fichiers d'initialisation de l'interpréteur de commandes tels que .bashrc et hérité par tous les scripts de l'interpréteur de commandes que vous exécutez depuis le Terminal, mais ne le sera pas pour launchd .

Vous pouvez voir le chemin que launchd est utilisé par :

launchctl getenv PATH

Si vous voulez la définir, vous pouvez le faire en

launchctl setenv PATH

par exemple, pour mon système, ce serait :

launchctl setenv /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

Si vous ne voulez pas avoir à vous rappeler de définir ce paramètre à chaque fois que vous démarrez votre ordinateur, vous pouvez l'ajouter à la liste des éléments suivants /etc/launchd.conf en ajoutant une ligne comme celle-ci :

setenv PATH /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

évidemment changer cela pour correspondre à votre système. Aussi, ne soyez pas surpris si /etc/launchd.conf n'existe pas sur votre système. Vous devrez peut-être le créer. Pour ce faire, je recommande un simple :

sudo pico -w /etc/launchd.conf

et lorsque vous avez terminé l'édition, appuyez sur control + X et suivez les instructions pour enregistrer les modifications.

0voto

Pierre Lagarde Points 491

Je sais que c'est un vieux message, mais comme il n'y a pas de véritable réponse, je vais juste poster une suggestion. Le problème est-il toujours d'actualité ou a-t-il été résolu ? Si ce n'est pas le cas, j'ai peut-être un indice car j'ai expérimenté le même problème.

Dans le terminal, vérifiez si votre fichier surveillé a des arguments étendus en utilisant cette commande :

ls -l@

Si votre fichier a des arguments étendus comme ceci :

com.apple.quarantine    32

essayez et tapez cette commande pour supprimer les arguments étendus (utilisez sudo si nécessaire) :

xattr -d -r com.apple.quarantine /Library/Logs/CrashPlan/history.log.0

dans votre cas

On dirait que les watchpaths de launchd ignorent les fichiers qui ont un argument étendu de quarantaine

J'espère que cela pourra vous aider.

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