0 votes

Comment démarrer avec launchd un bash script qui appelle fswatch avec `&`.

Manuellement, cela fonctionne

J'ai un bash script appelé git-watch.sh (lien gist) qui appelle fswatch dans une boucle comme celle-ci :

while read -r line; do
  {
    fswatch -r "$line" | grep --line-buffered -v '.git' | xargs -n1 -I{} git-commit-unattended.sh "$line";
  } &
done

(Notez le ampersand . J'ai dû l'utiliser parce que fswatch blocs en attente de changement, de sorte que le while ne passerait pas la première itération sinon. Cela pourrait interférer avec launchd mais je ne suis pas sûr).

Il fonctionne bien si je l'appelle depuis la ligne de commande en lui passant un fichier, par exemple

git-watch.sh < /Users/kbdluv/Dropbox/dotfiles/git-watch-paths.txt

Running ps aux | grep fswatch rendements :

kbdluv           9629   0.0  0.0  4278008    920 s001  S+    5:46PM   0:00.00 grep fswatch
kbdluv           9415   0.0  0.0  4299876   4912 s001  S     5:37PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/org
kbdluv           9414   0.0  0.0  4315736   4944 s001  S     5:37PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/dotfiles

C'est ce que nous voulons.


Launchd n'a pas

Mais maintenant, je veux qu'il démarre automatiquement à la connexion, et je n'ai pas réussi à obtenir launchd de coopérer.

Voici mon com.user.gitWatchMyPathsOnLogin.plist jusqu'à présent :

<?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>com.user.gitWatchMyPathsOnLogin</string>
   <key>ProgramArguments</key>
   <array><string>/Users/kbdluv/Dropbox/dotfiles/scripts/git-watch-my-paths-on-login.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
   <key>StandardOutPath</key>
   <string>/tmp/com.user.gitWatchMyPathsOnLogin.out</string>
   <key>StandardErrorPath</key>
   <string>/tmp/com.user.gitWatchMyPathsOnLogin.err</string>
</dict>
</plist>

Il se charge sans erreur. Il démarre sans rien sortir sur stderr ou stdout non plus, mais voici ce qu'il en est ps aux | grep fswatch me donne :

kbdluv          11550   0.0  0.0  4267768    888 s001  S+    7:56PM   0:00.00 grep fswatch
kbdluv          11545   0.0  0.0  4298088   4932   ??  S     7:56PM   0:00.01 fswatch -r /Users/kbdluv/Dropbox/org

Il fonctionne fswatch uniquement avec le dernier dans le git-watch-paths.txt fichier. (Le fswatch pour dotfiles est manquant).

Et il n'y a pas d'auto-commitabilité quand un changement se produit, donc je suppose que les parties fswatch ne sont pas appelés.


Qu'est-ce que je fais mal, ou comment pourrais-je déboguer davantage lorsque launchd n'envoie pas d'erreur ou ne produit rien ?

1voto

thrig Points 777

Que se passe-t-il si vous modifiez git-watch.sh d'utiliser la commande "wait" pour attendre les processus en arrière-plan ?

while read -r line; do
  {
    fswatch -r "$line" | grep --line-buffered -v '.git' | xargs -n1 -I{} git-commit-unattended.sh "$line";
  } &
done

wait

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